前提・実現したいこと
少量の異常データを用いた異常検知についてのこの論文(Autoencoding Binary Classifiers for Supervised Anomaly Detection)を実装したいです。
オートエンコーダを用いた異常検知を実装しています。
今の状況(教師なし学習)では下のように正常データと異常データがきれいに分離できていないようです。
![]
そこで、少量のラベル付き異常データを用いて、オートエンコーダによる教師あり学習の異常検知をしたいです。
この論文を読むと損失関数を下の式のようにすればいいそうですがこの通りに実装して少量の異常データを用いるとうまく学習ができません。
発生している問題・エラーメッセージ
上の行が元のデータ、下の段が復元されたデータ
左の列が正常データのみで学習させた教師なし学習のとき、右の列が正常データ+少量の異常データで学習させた教師あり学習のときの画像です。教師あり学習のときは学習がうまくできていないため、うまく復元できてないです。
該当のソースコード
論文で提案されている損失関数を実装してみたものです。
python
1def custom_loss(label): 2 def loss(input_img, decoded): 3 return label*mae(input_img,decoded)-(1-label)*K.log(1-K.exp(-1*mae(input_img,decoded))) 4 return loss
実装したオートエンコーダです。
python
1input_shape = np.prod(train.shape[1:]) 2input_img = Input(shape=(input_shape,)) 3Y = Input(shape=(1,)) 4encoded = Dense(encoding_dim, activation='relu')(input_img) 5decoded = Dense(input_shape, activation='sigmoid')(encoded) 6autoencoder = Model(inputs=[input_img,Y], outputs=decoded) 7 8autoencoder.compile(optimizer='adam',loss=custom_loss(Y)) 9 10autoencoder.fit([train,y_train], train, 11 epochs=500, 12 batch_size=32, 13 shuffle=True 14 )
試したこと
異常データの数を変えてみた。→異常データを多く入れるほど学習がうまく進まなかった。
補足情報
googlecolabで実装しました。
使用したデータはMVTecのサイトから入手したものです。
あなたの回答
tips
プレビュー