7‐07 2層目シミュレーションとEXCELの答え合わせ

●2層目は出力が32chになる

 
図7‐50はシミュレーションを2.015msほど走らせた辺り、tb_VideoProc/VideoProcCore/gts_hw/conv_layer2/MacShift_00〜31といった信号を見ています。

図7-50 32chの結果が同時に出てくる

●積和演算が合っているかはEXCELと比較

 図7‐51は2層目のEXCELファイル(TS_layer2.xlsm)の
im2colAll_W2シートです。これは行列乗算の16枚のシートim2col00_W2〜im2col15_W2を足し込んだものです(入力が16chなので16枚を足し込んで1枚)。

 同図の
A列を見ると図7‐50のMacShift_00の値とピタリ一致していることが分かります。隣のB列はMacShift_01、その隣C列はMacShift_02... 右端のAF列がMacShift_31と等しいことを確認しましょう(出力が32chなので32列ある)。

図7-51 im2colAll_W2シートと比較

一つの積和演算器の一つの演算結果に注目

 図7‐51の左上の-12560に注目し、その値を求める過程を見てみます。図7‐52はconv_layer2/dotpro_00_00(積和演算器)の信号です。
 同図の左の枠内PixRomData(画像データ)が10、MatRomData(重み係数)が1、
mulout(乗算結果)が40になっています。
 真ん中の枠内はPixRomDataが11、MatRomDataが2、muloutが88になっています。右の枠内はそれぞれ4, -3, -32となっています。

図7‐52 カーネルは3×3、入力4chぶん36回の積和

係数の種類は8つに集約されている

 係数は3ビットにエンコードされており、まとめると次の表のようになります。「本来乗算されるべき値」の
1/4が乗算されています(その理由はこれ)。
係数(2進) 係数(10進) 乗算される値 本来乗算されるべき値
011 3 16 64
010 2 8 32
001 1 4 16
000 0 1 4
111 -1 -1 -4
110 -2 -4 -16
101 -3 -8 -32
100 -4 -16 -64

●一つの積和演算器が入力4ch受け持つ(入力は16chある)

 図7‐52ではMATMULOUT(mac_00_00と同じ信号)の右端に69が出ています。2層目はこの図のように積和演算器4つで出力1chを計算するので、mac_00_00〜mac_00_03を足し込みます。さらにこの理由で4倍してMacShift_00とします。図7‐53のように (69-1517-944-748) x4 =
-12560となっています。

図7‐53 mac_xx_00〜03は出力XXchを計算するためのもの

●EXCELのtruncateシートとRelu_xxを比較

 積和演算の後は図7‐53のようにバイアス加算、8ビットシフト、ReLUを経てRelu_00とします。図7‐54はEXCELのtruncateシートですが、そのA列とピタリ一致することを確認します。


次のページへ

目次へ戻る