Theano で Convolutional Neural Net - まんぼう日記 のつづき.前回のプログラムでは,max-pooling の後で ReLu する場合にしきい値を入れ忘れてました.それを直すついでに,プログラム全体を書き直してすっきりさせました.
関連記事:
- MNISTのデータを読み込むPythonプログラム - まんぼう日記 mnist0117.py
-
(2015-02-11追記) Theano で MLP & CNN (2) - まんぼう日記 で正則化項入れました
MLPのプログラムを整理
従来は,一つの層の入出力を定義する Layer クラスと,それを用いてMLPの入出力および学習アルゴリズムの Theano 関数を定義する MLP クラスを別のファイルに分けてて,その上 MLP クラスの方は2層と3層で書き分けてました.すっきりさせるため,MLP クラスで任意の隠れ層数のんを区別せんと扱えるように大修正.ついでに,Layer クラスについては,しきい値なしの場合に不要な shared variable を作らないように微修正等々.
ソースはこちら:
- mnist0117.py cf. MNISTのデータを読み込むPythonプログラム - まんぼう日記
- nnet0210.py Layer クラスと MLP クラスの定義
- mnist_mlp0210.py 上記を使ってMNISTの識別実験をするプログラム
CNNのプログラムを整理
上記 MLP のプログラムと同様ののりで.ほとんど一から書き直してます.こんなんになりました.
- ConvLayer クラス: convolution層.
- PoolLayer クラス: max-poolingの層.pooling後に ReLu 等の活性化関数を通せるようにした.
- FullLayer クラス: 普通のMLPと同じ全結合の層.nnet0210 の Layer を継承してる.ただし,ConvLayer や PoolLayer の出力である4-Dテンソルを2-D行列に変換して入力できるようにしてある.
- CNN クラス: MLP クラスの CNN 版.
ソースはこちら:
- convnet0210.py ConvLayer, PoolLayer, FullLayer の各クラスおよび CNN クラスの定義
- mnist_convnet0210.py 上記を使ってMNISTの識別実験をするプログラム
実験
Theano で Multi Layer Perceptron - まんぼう日記 および Theano で Convolutional Neural Net - まんぼう日記 と同じ条件では全く同じ結果が得られるので,省略.
pooling後に ReLu する場合にちゃんとしきい値をつけたらこうなりました.
入力 - convolution層 - pooling層 - softmax層という構造.前回の「2層の場合」と同じ.
### Conv-Pool-Softmax Xdim: (1, 28, 28) # W1dim: (16, 5, 5) ds1: (4, 4) H1: 576 ### training: NL = 50000 NV = 10000 K = 10 batchsize = 100 0 2.2980 90.32 2.2965 90.07 中略 50 0.0110 0.34 0.0569 1.42 # NT = 10000 50 0.0110 0.34 0.0569 1.42 0.0564 1.57 CPU times: user 28min 24s, sys: 18 s, total: 28min 42s Wall time: 28min 34s
テスト誤識別率 1.57%.活性化関数なしの場合と大差ないようです.
conv層 - pool層をもういっちょ入れてみた.前回の「3層の場合その1」でReLu使った場合に相当.
### Conv-Pool-Conv-Pool-Softmax Xdim: (1, 28, 28) # W1dim: (16, 5, 5) ds1: (4, 4) H1: 576 # W2dim: (16, 5, 5) ds2: (4, 4) H2: 16 中略 50 0.0006 0.00 0.0744 1.14 0.0590 1.22 CPU times: user 40min 25s, sys: 28.1 s, total: 40min 53s Wall time: 40min 53s
テスト誤識別率 1.22%.やぱしconv層 - pool層に ReLu 入れても効果は見えません.
上記の出力側のconv層 - pool層をReLu層に置き換えてみた.前回の「3層の場合その2」に対応.
### Conv-Pool-ReLu-Softmax Xdim: (1, 28, 28) # W1dim: (16, 5, 5) ds1: (4, 4) H1: 576 # H2: 400 中略 50 0.0002 0.00 0.0521 0.90 0.0348 0.87 CPU times: user 33min 27s, sys: 24.7 s, total: 33min 52s Wall time: 29min 55s
テスト誤識別率 0.87%.上に同じ.
結局,conv層 - pool層に非線形性を入れてもほとんど効果ありませんでした.そもそもmax-poolingしてて, ReLu と似たようなことになってるから?