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化します。 |
次のページへ
目次へ戻る
|