Tensorflow(公式)のVariationalAutoEncoderを動かして遊んだ
前回のAutoEncoderの続きでVariationalAutoEncoderを動かして遊びました。
VariationalAutoEncoderの理論は以下のサイトがめちゃくちゃ詳しく書いてありました。
https://nzw0301.github.io/notes/vae.pdf
AEとの大きな違いは潜在変数zを取得するのに確率分布を使っている点です。エンコーダーは入力(X)の特徴を圧縮してn次元のガウス分布の平均μと分散σを出力し、その2つをもとにして潜在変数zをサンプリングで求めます。
VariationalAutoencoderRunner.py実行
バリエーショナルオートエンコーダを実行する時はVariationalAutoencoderRunner.pyを実行することになります。
デフォルトの設定でも実行可能ですが、VariationalAutoencoderRunner.pyのコードでエポック数、バッチサイズを調整します。
今回はVariationalAutoencoderRunner.pyの最後に以下を書き加えて結果を画像で出力できるようにします。
ほとんどオートエンコーダの時と同じです。
コマンドでAutoencoderRunnerを実行します。
python VariationalAutoencoderRunner.py |
異常検知
公式にちゃんとしたガイドがないので以下のサイトを参考にして作りました。
今回はmnistの「1」という数字以外の画像に対し異常検知するプログラムを書いていきます。
VariationalAutoencoderRunner.pyの
X_train, X_test = min_max_scale(mnist.train.images, mnist.test.images)
直下に以下のコードを追加します。
続いてVariationalAutoencoderRunner.pyの最後に以下のコードを追加します。
VariationalAutoencoderRunner.pyを実行すると以下のような画像が出てくると思います。
一番上の行は元の画像、2番目は再構成画像、3番目はその差分画像です。
「1」以外の数「9」の時scoreが高くなっていることが分かります。つまり異常だということを示しています。
今回はAutoencoderでも動かせるようにするため差分画像を用いて評価していますが、VAEでは以下のようなコスト関数を用いて評価するようです。
(式はhttps://qiita.com/shinmura0/items/811d01384e20bfd1e035より)
「深層生成モデルによる非正則化異常度を用いた工業製品の異常検知」の論文では
としてコスト関数を設けるとよりいい結果が得られると書かれています(多分)。
補足になりますが「1」と「9」でのスコアのヒストグラムは以下のようになります。
ネットを調べるとVAEの以上検出はほぼkerasで行われているようです。Tensorflow公式を使っているサイトはないんじゃないでしょうか...?
余談ですが、機械学習初心者過ぎてmnistを「1」、「9」だけのものだけを使うコードを書くのに苦労しました。