概要
googlenetやmobilenet等、最近のCNNモデルでは、当たり前の様にpointwise convolution(1x1の畳み込み)を使って次元数を調整する・・・等の説明がなされるけれど、1x1で畳み込んでも結局意味ないじゃん?と最初理解に苦しんだので、自分なりにまとめておく。
「1x1の畳み込み」という言葉だけ聞くと、何の意味もないフィルタの様に思えてしまうけれど、実際は1x1xLbeforeという、各層にまたがる細ながーいフィルタを適応している。以下の図の様な細長いフォルタを使って、入力層から重要そうな部分を選別して取り出し、一つの層にまとめている。この処理を出力層分(HxWxLafter回)繰り返すことによって、層数を簡単に任意の値にできるという点が最大のメリット。
以下に、パラメータ、入出力サイズ、メリットについても自分なりの理解をまとめる。
#自分なりの理解なので、間違っている部分があれば是非ご指摘ください。
[pointwise convolution(1x1の畳み込み)の概念図]
1x1の畳み込みを出力一層で適応した場合はこうなる。これが基本の適応系。
上記畳み込みフィルタを必要な出力層(Lafter)分だけ適応して、重ねることで任意の総数の出力を得ることができる。
この図では、層数を増やす形で畳み込みフィルタを適応している。
(レシートの裏にメモしたものをスキャンしたので汚い笑)
pointwise convolutionのパラメータ数、計算量
・出力層一層に対するパラメータ数は1x1xLbefore
・よって、Lafter層の出力を得るために必要なパラメータは1x1xLbeforexLafterとなる
・畳み込みに必要な計算量はHxWxLbeforexLafter、3x3の畳み込み等に比べると計算量は1/9だが、一般的なフレームワークでは関数呼び出しにかかる時間が加味されるため、ここまで高速にはならない模様
pointwise convolutionの出力
・H,Wのサイズは畳み込み前、後で基本的に同じ(stride=1の場合に限るが、通常はstride=1で適応することが多い)
・出力の総数はパラメータ数を変えることで、任意のサイズを指定することができる(ここが重要!!!)