機械学習・自然言語処理の勉強メモ

学んだことのメモやまとめ

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ピクセルの画像であることを意味する。
      ※自然言語処理の場合、入力は、固定長の文章の長さ×分散ベクトルとなる。
      (下記は入力イメージ)   image.png

  • filter_shape:変数名の通り、フィルタのサイズをテンソルで定義。 例)filter_shape=(20, 1, 5, 5) 
      20は、畳み込み処理後、作成される特徴マップの数。
      (=畳み込み層のユニット数)
      1は、フィルターのチャネル数。
      5×5はフィルターのサイズ。
      ※自然言語処理の場合、n-gram×分散表現ベクトルのフィルターを用意する。
       また、フィルター毎に異なる特徴マップを得るため、
       ユニットで異なるフィルターサイズを適用する場合がある。
      (下記はイメージ)
       image.png

  • image_shape:入力画像のサイズを4Dテンソルで指定
    例)image_shape=(batch_size, 1, img_h, img_w)
      ※自然言語処理の場合、
       img_hは固定長の文章の長さ、img_wは分散ベクトルとする。
  • poolsize:プーリングに用いるフィルタサイズ
    例)pool_size=(2,2)
       image.png

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の特徴マップが作られる。

畳み込み後の特徴マップは赤枠の通り。

image.png

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を用意するのが一般的。
 一つの特徴マップから、最も重要な値を取り出す。

ダウンサンプリング後の特徴値は赤枠の通り。

image.png

*1:batch_size, 1, 28, 28