まんぼう日記

takataka's diary

Denoising Autoencoder の実験をしてみる (4)

Denoising Autoencoder の実験をしてみる (3) - まんぼう日記 のつづき.て,2年前の記事のつづきかよって感じですが.そん時と同じ実験(MNISTにごま塩とランダム平行移動のノイズを加えて denoising)を TensorFlow でやってみた,という話です.

 

詳しい話は上記リンク先の記事を参照してもらえばよいので,ここにはあっさりとプログラムとか実行結果をば.

 

プログラムはこちら(ver.20170817の方):

https://gist.github.com/takatakamanbou/19b7457c1f271700af056421f8ec72cf

 

ネットワークの構成は次の三通り.全て,ノイズを加えた画像を入力としてその元画像(ノイズなし)を出力の正解とする denoising AutoEncoder です.

  • 条件Linear:  線形2層MLPによる denoising AutoEncoder.入力768次元,隠れ層ニューロン数1000,出力ニューロン数768.
  • 条件ReLU: 上記の隠れ層にバイアス項を加え,活性化関数を ReLU にしたもの.
  • 条件ReLU3: 条件ReLUと同じ設定の隠れ層をもう1層追加.

 

学習後のネットワークにテスト画像を入力して denoising させてみると,こんなんなりました.

ノイズを加えたテスト画像 f:id:takatakamanbou:20170818181257p:plain
元の画像(正解) f:id:takatakamanbou:20170818181634p:plain
条件Linearでの出力 f:id:takatakamanbou:20170818181820p:plain
条件ReLUでの出力 f:id:takatakamanbou:20170818181835p:plain
条件ReLU3での出力 f:id:takatakamanbou:20170818181847p:plain

 

学習の様子.GeForce GTX 1080 使いました.sqeL, sqeV, sqeTは,学習データ(MNISTの学習データ6万枚のうち最初の5万枚),検査データ(残り1万枚),テストデータ(テストデータ1万枚)での,出力と正解との平均二乗誤差です.

<条件 Linear>
In [12]: %time %run ex170817daeL.py /gpu:0
# <linearAE170817.LinearAE object at 0x7f406f0eb390>
#     sqeL   sqeV
0 0 134.667979551 133.316992969
100 10000 36.8419604199 37.4187404297
 :
1000 100000 34.0689229346 34.8956889404
 :
5000 500000 32.9019669678 33.6755770996
 :
10000 1000000 32.839681875 33.6528670166
CPU times: user 1min 30s, sys: 8.85 s, total: 1min 39s
Wall time: 1min 3s

In [64]: %run ex170817daeT.py
# <linearAE170817.LinearAE object at 0x159a1c908>
# sqeL sqeV sqeT
32.84  33.65  33.47
<条件 ReLU>
In [5]: %time %run ex170817daeL.py /gpu:0
# <reluAE170817.ReLUAE object at 0x7f405c543748>
#     sqeL   sqeV
0 0 94.1615285938 93.177168457
100 10000 32.5207284521 32.9867842285
 :
1000 100000 18.2016388818 20.9610388306
 :
5000 500000 13.8773649451 20.8368718262
 :
10000 1000000 12.740861156 21.9447665527
CPU times: user 1min 29s, sys: 8.13 s, total: 1min 37s
Wall time: 1min 3s

In [65]: %run ex170817daeT.py
# <reluAE170817.ReLUAE object at 0x187637160>
# sqeL sqeV sqeT
12.74  21.94  21.73
<条件 ReLU3>
In [1]: %time %run ex170817daeL.py /gpu:0
# <reluAE3170817.ReLUAE3 object at 0x7f40a4c268d0>
#     sqeL   sqeV
0 0 74.7140612988 73.9807450684
100 10000 29.0753343896 29.2979303711
 :
1000 100000 16.394145835 18.8423206055
 :
5000 500000 11.1345474158 18.4935889038
 :
10000 1000000 9.5610569104 19.5329217651
CPU times: user 1min 39s, sys: 9.54 s, total: 1min 49s
Wall time: 1min 10s

In [66]: %run ex170817daeT.py
# <reluAE3170817.ReLUAE3 object at 0x16cfd76d8>
# sqeL sqeV sqeT
9.56  19.53  19.43

左から順に,いくつのバッチを学習したか(バッチサイズは100),いくつの画像を学習したか,sqeL,sqeV です.ReLU/ReLU3 は結構 overfitting してますね.