TheanoのLeNetConvPoolLayerについて
Theano(LeNetConvPoolLayer)
LeNetConvPoolLayerクラスのチュートリアルはここ。
Convolutional Neural Networks (LeNet) — DeepLearning 0.1 documentation
論文の実装をするときは、このクラスを元に実装するのが正攻法だと思う。
なんで、LeNetConvPoolLayerクラスについてまとめる。
Theanoでの畳み込み処理関数
CNNでは、conv2d()関数が畳み込み処理の主な演算を行ってくれる。
しかし、畳み込み層の定義や構成などは自分で決めなければならない。
LeNetConvPoolLayerクラスは畳み込み層の定義や構成に関する部分を担当する。
パラメータ
LeNetConvPoolLayerクラスは下記の引数を受け取る。
conv_layer = LeNetConvPoolLayer(rng, input=layer0_input, image_shape=(batch_size, 1, img_h, img_w), filter_shape=filter_shape, poolsize=pool_size, non_linear=conv_non_linear)
- input:
入力値のサイズをテンソルで定義。
例)layer0_input = x.reshape*1
1は、チャネル数。
28,28は画像サイズ。入力が28×28ピクセルの画像であることを意味する。
※自然言語処理の場合、入力は、固定長の文章の長さ×分散ベクトルとなる。
(下記は入力イメージ)
- filter_shape:変数名の通り、フィルタのサイズをテンソルで定義。
例)filter_shape=(20, 1, 5, 5)
20は、畳み込み処理後、作成される特徴マップの数。
(=畳み込み層のユニット数)
1は、フィルターのチャネル数。
5×5はフィルターのサイズ。
※自然言語処理の場合、n-gram×分散表現ベクトルのフィルターを用意する。
また、フィルター毎に異なる特徴マップを得るため、
ユニットで異なるフィルターサイズを適用する場合がある。
(下記はイメージ)
- image_shape:入力画像のサイズを4Dテンソルで指定
例)image_shape=(batch_size, 1, img_h, img_w)
※自然言語処理の場合、
img_hは固定長の文章の長さ、img_wは分散ベクトルとする。 - poolsize:プーリングに用いるフィルタサイズ
例)pool_size=(2,2)
conv2d()
# convolve input feature maps with filters conv_out = conv2d( input=input, filters=self.W, filter_shape=filter_shape, input_shape=image_shape )
theano.tensor.nnet.conv.conv2d()関数が畳み込み処理を行う。
必要な引数を与えると、畳み込み処理結果(特徴マップ)を返す。
※自然言語処理の場合、一つの畳み込み層のユニットから、
N行×1列の特徴マップを作るのが一般的。
例)固定サイズが7の入力に3×Nのフィルターを適用すると、
5(7-3+1)×1の特徴マップが作られる。
畳み込み後の特徴マップは赤枠の通り。
max_pool_2d()
特徴マップから、プーリングサイズに基づき、ダウンサンプリングを行う。
max_pool_2dのinputは、conv2dの戻り値。
pooled_out = downsample.max_pool_2d( input=conv_out, ds=poolsize, ignore_border=True)
*theano.tensor.signal.pool.pool_2d でないとエラーになる。
max_pool_2dのパラメータ
- input:プーリングの入力。畳み込み層で作成した特徴マップを入力とする。
- ws:プーリングに用いるフィルタサイズを指定。
- ignore_border: プーリングを無視するかどうか。
5×5の入力の場合、Trueで2×2、Falseで3×3を返す。 - stride:マップをシフトするストライド幅。(指定がない場合、wsと同じ値)
- mode:集計演算に使用する関数。(デフォルトはmax)
- padding:四隅の0埋め範囲。(デフォルトは(0,0))
※自然言語処理の場合、特徴マップと同じサイズのwsを用意するのが一般的。
一つの特徴マップから、最も重要な値を取り出す。
ダウンサンプリング後の特徴値は赤枠の通り。
*1:batch_size, 1, 28, 28