SSIM について
ここで、MVtecの論文を見るとSSIMオートエンコーダとある。
よく理解していなかったが、mseよりもいい感じにロスが出せるものらしい、通常であれば、同じ位置(同画素位置)で計算されるが、データによってばらつきがある場合、
[0000010000011]
[0000001000011]
こんな感じの時、ずれがあることが分かる。もしこれのどちらも正常だとするならば、mse等の同じ位置等で評価するものだとずれていてうまくいかない。って認識だと思われる。
SSIMでは、平均画素値、標準偏差、共分散とかから求めるので微細なずれがあっても正しく判別できるらしい
?マハラノビス距離に似ている気がする。
というのを以下のサイトで見つけた。
https://qiita.com/kotai2003/items/2d6ab5771fdc57c05507
実行してみる
def custom_loss(y_true, y_pred):
loss= 1-tf.reduce_mean(tf.image.ssim(y_true, y_pred,
max_val = 1.0,filter_size=11,
filter_sigma=1.5, k1=0.01, k2=0.03 ))
return loss
として、
model.compile(optimizer='adam', loss=custom_loss)
とする。
その結果、
unknown loss function カスタムオブジェクトを指定してくれというエラーが出た。
検証時に使用する記事が多く、学習時にエラーが出たという記事が見られなかったためにこのような問題が発生した。
自作関数(def)とかしたやつはそのまま、loss=custom_lossとする。
読み込む系のは"mse"みたいにする。
実行結果
今回は畳み込みオートエンコーダを構築し自前の画像データで検証を行った。
ついでにMSEとの比較も行う
条件
学習枚数700枚
テスト枚数100枚
画像サイズ320*256
エポック600
早期終了20回
ロス SSIM mse
学習率0.01
mse
SSIM
見た感じ復元は滑らか
具体的な数値?画素数とかカウントすれば差が出てくるかもしれないので試してみる。