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列とピタリ一致することを確認します。 |
次のページへ
目次へ戻る
|