8‐01 畳み込み3層目は入力32ch、出力64ch

●3層目は乗算器128個で演算

 図8‐01は3層目の演算イメージです。入力32チャネルを
16chづつ2組に分けます(ここ参照)。そしてCh0〜15を1個の積和演算器でまかないます。Ch16〜31も1個でまかない、計2個の積和演算器で出力1チャネルを計算させます。
 出力は
64チャネルあるので積和演算器は合計2×64=128個になり、128並列で演算されます。畳み込みの結果、出力画像は一回り小さくなり11×11画素になります。

図8-01 3層目は乗算器が128個必要になる → ビットシフトによる乗算、係数は4種類

●乗算器やROMの節約

 3層目は乗算器が128個必要になるので、この層も「ビットシフトによる乗算」を行います。また重み係数は
種類(+64, +16, -16, -64)に集約します。これによりROMのビット数を削減することができます。


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

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

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

 出力1枚11行にかかるサイクル数は 1584x 11 = 17424、出力は並列で演算されるので、64枚にかかるサイクル数は同じ17424になります。クロック100MHzなら、1行に
15.84us、1枚に174.24usかかります。

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

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

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

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

 
3層目は入力32ch、出力64chなので係数の数は9×32×64= 18,432個になり、2層目より4倍増えます。これらはROMのデータになりますが、そのHDLファイルはももちろんVBAで自動生成させます。

次のページへ

目次へ戻る