ココアのお勉強ブログ

技術職の一般人です。趣味でコード書いたりソフト触ったり。

Tensorflow(公式)のVariationalAutoEncoderを動かして遊んだ

前回のAutoEncoderの続きでVariationalAutoEncoderを動かして遊びました。

VariationalAutoEncoderの理論は以下のサイトがめちゃくちゃ詳しく書いてありました。

qiita.com

https://nzw0301.github.io/notes/vae.pdf

AEとの大きな違いは潜在変数zを取得するのに確率分布を使っている点です。エンコーダーは入力(X)の特徴を圧縮してn次元のガウス分布の平均μと分散σを出力し、その2つをもとにして潜在変数zをサンプリングで求めます。

 

VariationalAutoencoderRunner.py実行

バリエーショナルオートエンコーダを実行する時はVariationalAutoencoderRunner.pyを実行することになります。

デフォルトの設定でも実行可能ですが、VariationalAutoencoderRunner.pyのコードでエポック数、バッチサイズを調整します。

f:id:hotcocoastudy:20190219220915p:plain

VariationalAutoencoderRunner.py(一部)

今回はVariationalAutoencoderRunner.pyの最後に以下を書き加えて結果を画像で出力できるようにします。

f:id:hotcocoastudy:20190219220950p:plain

VariationalAutoencoderRunner.py最後に追加

ほとんどオートエンコーダの時と同じです。

コマンドでAutoencoderRunnerを実行します。

python VariationalAutoencoderRunner.py

 

f:id:hotcocoastudy:20190219221042p:plain

f:id:hotcocoastudy:20190219221055p:plain

AutoencoderRunnerを実行

 

異常検知

公式にちゃんとしたガイドがないので以下のサイトを参考にして作りました。

cedro3.com

今回はmnistの「1」という数字以外の画像に対し異常検知するプログラムを書いていきます。

VariationalAutoencoderRunner.pyの

X_train, X_test = min_max_scale(mnist.train.images, mnist.test.images)

直下に以下のコードを追加します。

f:id:hotcocoastudy:20190219221239p:plain

VariationalAutoencoderRunner.pyの X_train, X_test = min_max_scale(mnist.train.images, mnist.test.images) 直下にこのコードを追加

続いてVariationalAutoencoderRunner.pyの最後に以下のコードを追加します。

f:id:hotcocoastudy:20190219221335p:plain

VariationalAutoencoderRunner.pyの最後にこのコードを追加

VariationalAutoencoderRunner.pyを実行すると以下のような画像が出てくると思います。

一番上の行は元の画像、2番目は再構成画像、3番目はその差分画像です。

f:id:hotcocoastudy:20190219221413p:plain

異常検出

「1」以外の数「9」の時scoreが高くなっていることが分かります。つまり異常だということを示しています。

 

今回はAutoencoderでも動かせるようにするため差分画像を用いて評価していますが、VAEでは以下のようなコスト関数を用いて評価するようです。

f:id:hotcocoastudy:20190219221440p:plain

(式はhttps://qiita.com/shinmura0/items/811d01384e20bfd1e035より)

 

「深層生成モデルによる非正則化異常度を用いた工業製品の異常検知」の論文では

f:id:hotcocoastudy:20190219221505p:plain

としてコスト関数を設けるとよりいい結果が得られると書かれています(多分)。

 

補足になりますが「1」と「9」でのスコアのヒストグラムは以下のようになります。

f:id:hotcocoastudy:20190219221537p:plain

「1」と「9」でのスコアのヒストグラム

ネットを調べるとVAEの以上検出はほぼkerasで行われているようです。Tensorflow公式を使っているサイトはないんじゃないでしょうか...?

qiita.com

余談ですが、機械学習初心者過ぎてmnistを「1」、「9」だけのものだけを使うコードを書くのに苦労しました。