まんぼう日記

takataka's diary

Theano で Multi Layer Perceptron & Convolutional Neural Net

Theano で Convolutional Neural Net - まんぼう日記 のつづき.前回のプログラムでは,max-pooling の後で ReLu する場合にしきい値を入れ忘れてました.それを直すついでに,プログラム全体を書き直してすっきりさせました.

 

関連記事:

 

MLPのプログラムを整理

従来は,一つの層の入出力を定義する Layer クラスと,それを用いてMLPの入出力および学習アルゴリズムの Theano 関数を定義する MLP クラスを別のファイルに分けてて,その上 MLP クラスの方は2層と3層で書き分けてました.すっきりさせるため,MLP クラスで任意の隠れ層数のんを区別せんと扱えるように大修正.ついでに,Layer クラスについては,しきい値なしの場合に不要な shared variable を作らないように微修正等々.

 

ソースはこちら:

 

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 と似たようなことになってるから?