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 させてみると,こんなんなりました.
ノイズを加えたテスト画像 | |
元の画像(正解) | |
条件Linearでの出力 | |
条件ReLUでの出力 | |
条件ReLU3での出力 |
学習の様子.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 してますね.