6-05 im2col関数をどう実現するか

 畳み込みとは一種のフィルタ演算であり、それは積和演算の繰り返しで達成されます。では具体的にどのような演算を行うのか、ここで考察します。


●EXCELの2シート目im2colを開いてみる

 Pythonのプログラム内に
"im2col"という関数があります。それをEXCELに移植しましたが(このファイル)、その2シート目im2colは図6-25のようになっています。

 同図は28×28=784の画素を784×9の行列に展開したものです。こうすることにより、フィルタ係数との「畳み込み」が「行列の乗算」になります。


  図6-25 画像データを展開したim2col


●シートim2colとシートW1_Biasの行列演算

 3枚目のシートW1_Biasには
フィルタ係数があります。図6-26のように9×16の行列になっています。
 このようにフィルタは16個あり、フィルタ1個につき9個の係数があります。


  図6-26 フィルタ係数を16個横に並べてある


 一番左のフィルタ係数に注目して、im2colの行列との乗算を考えます。
 im2colは784行あるのでそれぞれフィルタ係数との積和が取られ、
784個の出力が得られます。図6-27ではフィルタは1個ですが、実際は16個あるので、結果的に出力は784×16の行列になります。


  図6-27 一番左のフィルタ係数との積和

●im2colという関数で行われること

 図6-28はim2col関数のイメージです。3×3の範囲が右に1画素づつ移動し、端まで行くと左端まで戻りますがその際、1画素下に移動します。これを右下まで
28×28=784回行います。この一連の動作における3×3の画素の値を横に並べたものがim2col関数です。



  図6-28 3×3の範囲を上下左右に走査


●メモリのリードアドレスの遷移を考える

 ハードウエアにおいて配列や行列は「
メモリ」に割り当てられます。図6-28の数字は各画素が格納されているメモリ・アドレスにあたります。

 そしてメモリ・アドレスは「
カウンタ」で生成しますが、どのようなカウンタを設計すれば良いでしょうか?それではメモリアドレスの遷移を見てみましょう(図6-29)。



  図6-29 網掛けの部分に注目

BaseAddrにOffsetを足せば良い

 図6-29の網掛けの画素(
BaseAddrと呼ぶ)に注目します。BaseAddrは図6-30のように遷移しています。

 それではほかの画素はどうでしょうか?同図右のようにBaseAddrにある決まった値(
Offsetと呼ぶ)を加算すればそれぞれのアドレスが得られることが分かります。



  図6-30 Offsetは固定値。BaseAddrに足す


目次へ戻る