ココアのお勉強ブログ

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

AutoEncoder(Tensorflow公式)で遊んだ

AutoEncoderとは

AutoEncoderとは、NNを用いて次元削減する手法です。自己符号化器とも呼ばれます。

詳細、仕組みは以下の参考サイトに非常に分かりやすく説明してあります。

www.slideshare.net

qiita.com

artificial-intelligence.hateblo.jp

    事前準備

AutoEncoder(Tensorflow公式)で遊んでみました。

github.com

AutoEncoder開発環境を構築するためには、事前に以下のアプリ/モジュールをインストールしておく必要があります。

  • Python3
  • numpy==1.15.1
  • Pillow==5.3.0
  • Tensorflow
  • scikit-learn
  • matplotlib

また、GPUNVIDIA社製)を使用する場合は、CUDAやcuDNN等のインストールが必要になります。

なお、ここではそれぞれのインストール方法等は省略します。

AutoencoderRunner.py実行準備

オートエンコーダを実行する時はAutoencoderRunner.pyを実行することになります。

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

f:id:hotcocoastudy:20190213030913p:plain

AutoencoderRunner.py(コード一部分)

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

f:id:hotcocoastudy:20190213031041p:plain

AutoencoderRunner.pyの最後に追加

ここではreconstruct(X_test)を用いて再構成を行っています。

AutoencoderRunner.py実行

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

python AutoencoderRunner.py

実行すると学習が始まり、以下のようになると思います。

f:id:hotcocoastudy:20190213031200p:plain

Total costが表示されると処理が終了します。

またtest画像とその生成(再構成)画像の結果の画像をそれぞれ10枚ずつの画像test.jpg、result.jpgが保存されます。

f:id:hotcocoastudy:20190213031221p:plain

test.jpg

f:id:hotcocoastudy:20190213031259p:plain

result.jpg

 

先ほどはreconstruct( X )を用いて再構成(エンコード→デコード)を行いました。

f:id:hotcocoastudy:20190213031326p:plain

エンコード(圧縮)だけを実行するにはtransformを用いて

f:id:hotcocoastudy:20190213031342p:plain

と書いてエンコードします。

xは以下のようになります。

f:id:hotcocoastudy:20190213031354p:plain
これを再びデコード(構成)するにはgenerateを用いて

f:id:hotcocoastudy:20190213031410p:plain

と書いてデコードします。

aは以下のようになります。

f:id:hotcocoastudy:20190213031421p:plain

reconstructを用いたときと同様に実行してみます。

f:id:hotcocoastudy:20190213031435p:plain

f:id:hotcocoastudy:20190213031444p:plain

result.jpg

reconstructを実行したときと同じ結果になります。

 

また、AutoencoderRunner.pyの34行目

 

autoencoder = Autoencoder(n_layers=[784, 200],

                          transfer_function = tf.nn.softplus,

                          optimizer = tf.train.AdamOptimizer(learning_rate = 0.001))

 

n_layers=[784, 200]の

784は入力サイズ(今回MNISTで28×28=784の画像)

200は隠れ層のユニット数を表している。この隠れ層のユニット数を変えることにより削減する次元を調整できるという訳です。


またAutoencoderはMNISTだけでなく独自データに対しても学習を実行できます。ここではやり方は省略します。