7‐01 畳み込み2層目は入力16ch、出力32ch

●乗算器は128個で演算。2層目はプーリングがある

 図7‐01は2層目の演算イメージです。入力16チャネルを
4chづつ4組に分けます(理由はここ)。そしてCh0〜3を1個の積和演算器でまかないます。Ch4〜7、Ch8〜11、Ch12〜15もそれぞれ1個でまかない、計4個の積和演算器で出力1チャネルを計算させます。
 出力は
32チャネルあるので積和演算器は合計4×32=128個になり、128並列で演算されます。畳み込みの結果出力画像は一回り小さくなり26×26画素、それがプーリングでさらに小さくなり13×13画素になります。

図7-01 2層目は乗算器が128個必要になる → ビットシフトによる乗算を適用

●乗算器やROMの節約

 2層目は乗算器が128個で並列演算しますが、このボード搭載のFPGAに乗算器は87個しかありません。したがって2層目は「ビットシフトによる乗算」を行います。また重み係数を8種類(+64, +32, +16, +4, -4, -16, -32, -64)に集約します。これによりROMのビット数を削減することができます。



●1ライン、1画面の演算にかかる時間

 入力画像は28×28なのでカーネル(3x3)の動く範囲は26×26になります。したがって横一行にかかるサイクル数は 9 x 26 x 4ch = 936です(*1)。

(*1)一つの乗算器で入力4chをまかなう。それらは逐次的に処理されるのでx4chのサイクルがかかる

 出力1枚26行にかかるサイクル数は 936 x 26 = 24336、出力は並列で演算されるので、32枚にかかるサイクル数は同じ24336になります。クロック100MHzなら、1行に
9.36us、1枚に243.36usかかります(最短で)。

パイプラインなのでスループットに間に合わせる

 1層目が1ライン出力するのに10.08usだったのを思い出しましょう。2層目が1ライン出力するのに9.36usなので、パイプライン的に間に合っていることになります。また、ここにあるようにCNNの1ブロックは
320usの周期でCNN推論回路に入力されます。上述のように243.36usで処理するので、これも間に合っています(*2)。

(*2)1層目と同期をとるため、2層目は1ライン9.36us + 休み時間 = 10.08us、1ブロック243.36us + 休み時間 = 320usで出力する。

●係数ROMは手作業でHDL化するのは大変なので・・・

 
2層目は入力16ch、出力32chなので係数の数は9×16×32= 4608個になり、1層目より一桁増ます。これらはROMのデータになりますが、そのHDLファイルはももちろんVBAで自動生成させます。


次のページへ


目次へ戻る