ノート/ノート
訪問者 791  最終更新 2015-04-21 (火) 11:34:55

(2015-04-19) Deep Learning Tutorialの例題をやってみた(2)

Deep Learning Tutorialの例題をやってみた
Deep Learning Tutorial 0.1

Denoising Autoencoders (dA) (2015-04-19)

チュートリアルにある実験のパラメタを変えるとどうなるか?

プログラムは、Denoising Autoencoders (dA)のページ にある通り。(プログラムのリストはこちら

教師なし学習の結果のフィルタの様子は、

手元の実行結果チュートリアル中の画像
ノイズなしfilters_corruption_0.pnghttp://deeplearning.net/tutorial/_images/filters_corruption_0.png
ノイズ30%filters_corruption_30.pnghttp://deeplearning.net/tutorial/_images/filters_corruption_30.png


フィルタ(=W)の出力側の本数は、チュートリアルの実験では500である。つまり28x28の画像を500の情報に圧縮している。この出力側の個数を小さくして、うんと情報を圧縮させてみる。
最終的には数字0から9までの10通りの出力なのだが、たとえば50ぐらいにしてみる。図では、出力が50までしかないので、絵も50しかない。

Wの出力側を50にした時の実行結果
ノイズなしfilters_corruption_0-2.png
ノイズ30%filters_corruption_30-2.png

おもしろいのは、チュートリアルにある出力500の時の実験だと、ノイズを加えない時には度のフィルタもぼやっとしているがノイズを加えたときには形がはっきりしてくる、つまり圧縮されていると思われる。それに比べて、出力を無理やり少なく(50に)した場合は、ノイズを加えても加えなくてもそれなりに形がはっきりしている。
この絵の形がはっきりしていることが、どれだけ弁別能力に対応するかはこれだけではわからないが、Denoisingの意味はこれでも見えるような気がする。

Stacked Denoising Autoencoders (SdA) (2015-04-20)

チュートリアルにある実験のパラメタを変えるとどうなるか?

その前に、dAの時のような「らしさ」の表示は可能か?

画像表示

元のサンプルプログラムには画像表示が無かったので、付け加えてみる。そもそもこの画像の意味が何か、議論の余地がありそうなのだが、とにかく。

やったこと => dA部分のプリトレーニングが終わった後の画像表示と、ファインチューニングが終わった最終段階の画像表示。

画像表示は28x28が前提 ⇒ ということは、dA層の1段目のみが表示可能。ちなみにdA層は3段になっていて、元のプログラムでは、dAの0は28x28(784)⇒500、dAの1と2はいずれも500⇒500にしてある。

class SdA の def __init__での定義
n_ins=784,
hidden_layers_sizes=[500, 500],
n_outs=10,

更に、dAでの画像表示は、マップWの出力から入力へ見た結合なので、1段目しか見えていないことになるが、とにかくそのままやってみた。(本来はもしかすると、3段目の出力から1段目の入力へ見た時の結合を計算する話かもしれない。考えがまだまとまらない。) 以下のコードを、プリトレーニング終了後でファインチューニング前の段階と、ファインチューニング後の、2カ所に挿入した。Wの値はdAの1段目つまり sda.dA_layers[0] から取っている。また、tile_raster_images は dAの時と同様に、util.py からimportしている。

プリトレーニング後でファインチューニング前
   image = Image.fromarray(tile_raster_images(
       X=sda.dA_layers[0].W.get_value(borrow=True).T,
       img_shape=(28, 28), tile_shape=(10, 10),
       tile_spacing=(1, 1)))
   image.save('./SdA_plots/filters_noFineTune.png')

ファインチューニング後 
   image = Image.fromarray(tile_raster_images(
       X=sda.dA_layers[0].W.get_value(borrow=True).T,
       img_shape=(28, 28), tile_shape=(10, 10),
       tile_spacing=(1, 1)))
   image.save('./SdA_plots/filters_FineTuning.png')

プログラムのリストはこちら
実行後の出力は、画像出力追加前と変わっていないが、fileこちら
画像は、

プリトレーニング後でファインチューニング前ファインチューニング後
1段目のdAのWの画像表示filters_noFineTune.pngfilters_FineTuning.png

更に、SdAを前提として、3段のフィルタW1, W2, W3を全部通して、つまり掛けて(行列積W1*W2*W3)、その積全体を(フィルタとして)画像化をしたものを作ってみたところ、次のようになった。中が見えるように敢えて拡大表示している。

プリトレーニング後でファインチューニング前ファインチューニング後
1段目のdAのWの画像表示3xfilters_noFineTune.png3xfilters_FineTuning.png

さて、この解釈だが、左のファインチューニング前の方が文字がはっきり見える。ちなみに、小画像の位置は左右共通である、つまりフィルタWの同じ位置を示している。ファインチューニングはおそらくは位置を変えるほどには影響しないだろうから、同じものと考えてよかろう。
たとえば、左図の中で、位置(1,1)の画像は数字4のように見える。(4,1)は6に見える。これが右図の中の同じ位置ではぼんやりしてよく分からない。

SdAで、中間層のhidden unitsの数を小さくする

元のサンプルでは、入力が28x28に対して、1段目の出力が500、2段目の出力が500としている(hidden_layers_sizez=[500,500]と書く)。これに対して、単一のdAの時にやってみたように出力を小さくするとどうなるか? たとえば、[200,50]としてみた。

出力ログは fileSdA_log_200-50.txt。 見えることは、

画像は、見た感じはほとんど変わらわないように見える。

プリトレーニング後でファインチューニング前ファインチューニング後
1段目のdAのWの画像表示filters_noFineTune-200-50.pngfilters_FineTuning-200-50.png

また、[50,50]ととした場合。

出力ログは fileSdA_log_50-50.txt。 同様に、

画像は、見た感じはほとんど変わらわないように見える。

プリトレーニング後でファインチューニング前ファインチューニング後
1段目のdAのWの画像表示filters_noFineTune-50-50.pngfilters_FineTuning-50-50.png

添付ファイル: fileSdA_log_50-50.txt 137件 [詳細] filefilters_noFineTune-50-50.png 199件 [詳細] filefilters_FineTuning-50-50.png 203件 [詳細] filefilters_noFineTune-200-50.png 178件 [詳細] filefilters_FineTuning-200-50.png 189件 [詳細] fileSdA_log_200-50.txt 173件 [詳細] file3xfilters_noFineTune.png 170件 [詳細] file3xfilters_FineTuning.png 197件 [詳細] fileSdA_log2.txt 124件 [詳細] fileSdA2.py 149件 [詳細] filefilters_noFineTune.png 200件 [詳細] filefilters_FineTuning.png 219件 [詳細] filefilters_corruption_30-2.png 172件 [詳細] filefilters_corruption_0-2.png 173件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2015-04-21 (火) 11:34:55 (971d)