[[ノート/ノート]]~
訪問者 &counter();  最終更新 &lastmod();~

*(2015-04-19) Deep Learning Tutorialの例題をやってみた(2) [#j54470eb]
[[Deep Learning Tutorialの例題をやってみた>ノート/Deep Learning Tutorialの例題をやってみた]]~
[[Deep Learning Tutorial 0.1:http://deeplearning.net/tutorial/]]


**Denoising Autoencoders (dA) (2015-04-19) [#b68e301f]
[[チュートリアルにある実験>ノート/Deep Learning Tutorialの例題をやってみた#dA]]のパラメタを変えるとどうなるか?

プログラムは、[[Denoising Autoencoders (dA)のページ:http://deeplearning.net/tutorial/dA.html#daa]] にある通り。(プログラムのリストは[[こちら:http://deeplearning.net/tutorial/code/dA.py]])


教師なし学習の結果のフィルタの様子は、
| | 手元の実行結果 || チュートリアル中の画像 |
|ノイズなし| &ref(ノート/Deep Learning Tutorialの例題をやってみた/filters_corruption_0.png); ||[[http://deeplearning.net/tutorial/_images/filters_corruption_0.png]] |
|ノイズ30%| &ref(ノート/Deep Learning Tutorialの例題をやってみた/filters_corruption_30.png); ||[[http://deeplearning.net/tutorial/_images/filters_corruption_30.png]] |
~
フィルタ(=W)の出力側の本数は、チュートリアルの実験では500である。つまり28x28の画像を500の情報に圧縮している。この出力側の個数を小さくして、うんと情報を圧縮させてみる。~
最終的には数字0から9までの10通りの出力なのだが、たとえば50ぐらいにしてみる。図では、出力が50までしかないので、絵も50しかない。

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

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


**Stacked Denoising Autoencoders (SdA) (2015-04-20) [#y39d51ab]
[[チュートリアルにある実験>ノート/Deep Learning Tutorialの例題をやってみた#SdA]]のパラメタを変えるとどうなるか?

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

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

やったこと => 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')


プログラムのリストは[[こちら:http://deeplearning.net/tutorial/code/SdA2.py]]~
実行後の出力は、画像出力追加前と変わっていないが、&ref(SdA_log2.txt,,こちら);~
画像は、
| |CENTER:プリトレーニング後でファインチューニング前|CENTER:ファインチューニング後|
|1段目のdAのWの画像表示| &ref(filters_noFineTune.png); | &ref(filters_FineTuning.png); |

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

| |CENTER:プリトレーニング後でファインチューニング前|CENTER:ファインチューニング後|
|1段目のdAのWの画像表示| &ref(./3xfilters_noFineTune.png,200%); | &ref(./3xfilters_FineTuning.png,200%); |

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

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

出力ログは &ref(SdA_log_200-50.txt);.\。 見えることは、
出力ログは &ref(SdA_log_200-50.txt);。 見えることは、
-結果のエラーは、悪くなったこと (ファインチューニング後の最終結果では1.37% ⇒ 1.99%)に劣化)
-ファインチューニングのepoch数が減ったこと(epoch11 以降はかえって劣化)、
-全体の行列の大きさが小さくなったので、その分時間が短縮されたこと、

画像は、見た感じはほとんど変わらわないように見える。
| |CENTER:プリトレーニング後でファインチューニング前|CENTER:ファインチューニング後|
|1段目のdAのWの画像表示| &ref(./filters_noFineTune-200-50.png,200%); | &ref(./filters_FineTuning-200-50.png,200%); |

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

出力ログは &ref(SdA_log_50-50.txt);。 同様に、
-結果のエラーは、悪くなったこと (ファインチューニング後の最終結果では1.37% ⇒ 1.99%)に劣化)
-ファインチューニングのepoch数が減ったこと(epoch11 以降はかえって劣化)、
-全体の行列の大きさが小さくなったので、その分時間が短縮されたこと、

画像は、見た感じはほとんど変わらわないように見える。
| |CENTER:プリトレーニング後でファインチューニング前|CENTER:ファインチューニング後|
|1段目のdAのWの画像表示| &ref(./filters_noFineTune-50-50.png,200%); | &ref(./filters_FineTuning-50-50.png,200%); |

//〜〜〜

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS