10‐01 全結合5層目は入力2048画素、出力128画素

●128チャネルの画面を重ねるイメージ

 畳み込み4層目の出力は128chあり、それぞれ4×4画素あります。また各値は0〜31に制限されており、符号なし
5ビットになります。
 4層目の出力RAMは図10‐01のように128chの画面を重ねるイメージです。4x4なのでアドレスは
0〜15、データのビット幅は640になり、これが5層目の入力になります(*1)。

(*1)畳み込み層ではラインバッファを介してデータをやり取りしたが、全結合層では読み出し方が変わってくるので4層目はフレームバッファに書き込む。

 4層目と5層目の間に図10‐01のようなフレームバッファを2個設け、ピンポンモードでデータをやり取りします。そうすれば「書きながら読む」ことができます。
 

図10-01 4層目の出力、5層目の入力が入るRAM

●データを一個づつ読んで分離して並べる

 図10‐01のフレームメモリのアドレス0を読むと、640ビットのデータが1個得られます。それを5ビットづづ分離して横に128個並べます。
 次にアドレス1を読んで横に128個並べ、同様にアドレス2, 3, 4... 15まで読んで並べ、このように計128×16=
2048個横一行に並べます。これが5層目の入力になります。


●5層目からはDense(全結合型)になる

 5層目の重み行列は2048行×128列で、このように入力と乗算します。乗算結果は
128画素になり、それにバイアスを加算したものが6層目の入力となります。全結合層ではこのような単純な行列乗算&バイアス加算を行います。

●5層目は16並列で計算

 5層目の行列乗算は2048 x 128回の乗算が必要になり、乗算器一個で行うと262,144サイクル、すなわちクロック100MHzで
2621.44usかかります。CNNの1ブロックは320us毎に入ってくるのでこれでは間に合いません。
 そこで乗算器を
16個使って並列に処理します。2621.44us/16 = 163.84usになり、間に合うことが分かります。

●ROMも16並列で読み出す

 重み係数を1つのROMに置いてしまうと、一度に係数1個しか読み出せません(ポートが1つなので)。したがって図10‐02のように
ROMを16個に分け、データを16個同時に読み出せるようにします。

図10‐02 128列を8列ごと16個に分ける

重み係数が一番多い5層目

 これら16個のROMのうち1個のROMに注目すると、それは2048行×8列あります。したがってでアドレスは11ビット、そして各アドレスに8個の係数が存在することになります。

 また5層目の重み係数は4種類に限定されているので係数1個は2ビットで表現できます。したがってアドレス
11ビット、データ幅 2x8= 16ビットのROMが16個あることになります。

 5層目も乗算はビットシフト型で行います。係数の数は2048 x 128 = 262,144と全層の中で最も多くなります。これら係数ROMもVBAをつかってHDL化します。

次のページへ

目次へ戻る