Posted at

Convolution処理の手法 Im2Col方式の図解

More than 1 year has passed since last update.

先日のConvolution処理の記事「高速な Convolution 処理を目指してみた。Kn2Image方式」で の 比較対象として紹介した Im2Col 方式 について図解します。


参考文献


Im2Col 方式


  • Im2Col方式の特徴は、行列積演算1回でConvolution処理を行うために、Source Image の画素配置を(重複ありで)変形させるところにあります。

  • 本記事では、変形させた画素配置を col展開 と呼称します。

  • 以下、順を追って図解します。


画素配置変換 (Image → Col展開)


  • 下図の8×6の画像 を 入力画像として説明していきます。

  • 説明用に1画素のみ 色 を変えてあります。


  • フィルタは 3×3 です。

  • ⑤を注目画素とします。



  • 左上の画素を始点とします。

  • 注目画素 と 近傍(3×3)を、1列にシリアライズします。

  • 範囲外の ①②③④⑦ は 0値 を格納します。



  • 注目画素を右に移動させます。

  • 同様に、注目画素 と 近傍(3×3)を、1列にシリアライズします。



  • 同様に...



  • 右端に達すると、



  • 注目画素を 一行下の左端に 移します。



  • 同様に...



  • 同様に...



  • 同様に...



  • 同様に...



  • 同様に...



  • 同様に...


  • Sorce Image の右下の終点まで行います。



補足


  • Sorce Image の画素A は、Col展開上に9か所($A_1$~$A_9$)に 存在します。



画素配置変換 (Col展開 → Image)


  • 先ほどとは逆に、Col展開 から Image状 に戻す方法です。

  • 逆伝播で dIn を算出する際に 使用します。 

  • 先ほどの Col展開 の図を用います。



  • 左端を開始列とします。

  • 注目列 を 3x3に戻します。



  • 注目列を1つ左に移します。

  • 注目列 の 3x3に戻します。 

  • Destination Image に 加算 します。



  • 同様に、注目列を1つ左に移します。

  • 注目列 の 3x3に戻します。 

  • Destination Image に 加算 します。


  • 注目列が Col 展開の右端に達するまで繰り返します。


補足


  • Image 状に戻し終わった際、画素$A$の値は $A_1$~$A_9$ の総和 となります。


MCMK × MiniBatch

チャンネル と MiniBatch の col 展開の配置を 下図に示します。


順伝播


  • Bias 値を Out に BoradCast します。

  • 下記の行列演算で、Convolution処理となります。


  • 行列演算は BLAS の gemm関数がお勧めです。


逆伝播


  • 画素の傾きdIn , Weightの傾きdW , Biasの傾き dB を順に図解します。


dIn


  • $dIn = Weight^T × dOut$


  • Col展開(dIn) は Image状に戻し、前層に伝達します。


dW


  • $dW = In^T × dOut$


dB


  • dB は Channel 毎の dOut の総和です。


補足


  • cudnn の Convolution関数はアルゴリズムは選択可能になっており、その中の1つが この im2col 方式の様です。


ここまで読んで頂き、ありがとうございます。