8‐05 3層目シミュレーションとEXCELの答え合わせ
●3層目は出力が64chになる
図8‐50はシミュレーションを2.086msほど走らせた辺り、tb_VideoProc/VideoProcCore/gts_hw/conv_layer3/MacShift_00〜63といった信号を見ています。 |
図8-50 64chの結果が同時に出てくる
●積和演算が合っているかはEXCELと比較
図8‐51は3層目のEXCELファイル(TS_layer3.xlsm)のim2colAll_W3シートです。これは行列乗算の32枚のシートim2col00_W3〜im2col31_W3を足し込んだものです(入力が32chなので32枚足し込んで1枚)。
同図のA列を見ると図8‐50のMacShift_00の値とピタリ一致していることが分かります。隣のB列はMacShift_01、その隣C列はMacShift_02...
右端のBL列がMacShift_63と等しいことを確認しましょう(出力が64chなので64列ある)。 |
図8-51 im2colAll_W3シートと比較
●一つの積和演算器の一つの演算結果に注目
図8‐51の左上の-6160に注目し、その値を求める過程を見てみます。図8‐52はconv_layer3/dotpro_00_00(積和演算器)の信号です。
同図の左の枠内PixRomData(画像データ)が31、MatRomData(重み係数)が0、mulout(乗算結果)が31になっています。
右の枠内はPixRomDataが31、MatRomDataが-1、muloutが-31になっています。 |
図8‐52 係数は2ビット。00なら1倍、11なら‐1倍
●係数の種類は4つに集約されている
3層目の係数は2ビットにエンコードされており、まとめると次の表のようになります。「本来乗算されるべき値」の1/16が乗算されています(その理由は図8‐54)。 |
係数(2進) |
係数(10進) |
乗算される値 |
本来乗算されるべき値 |
01 |
1 |
4 |
64 |
00 |
0 |
1 |
16 |
11 |
-1 |
-1 |
-16 |
10 |
-2 |
-4 |
-64 |
表8‐01 乗算結果は本来の1/16の値になることに注意
●一つの積和演算器が入力16ch受け持つ(入力は32chある)
図8‐53では3×3×16ch=144サイクル(1440ns)かけて積和が行われ、MATMULOUT(mac_00_00と同じ信号)の右端に-25が出ています。3層目はこの図のように積和演算器2つで出力1chを計算するので、このmac_00_00にもう一つの積和結果mac_00_01を足します。 |
図8‐53 カーネルは3×3、入力16chぶん144回の積和をする
●4ビット左シフトして16倍
図8‐54のようにHDLではmac_00_00とmac_00_01を加算してMacAll_00として、更に16倍してMacShift_00とします。各積和演算器で値が1/16なっている(表8‐01)のを相殺します。 |
図8‐54 conv_layer3.vhdの一部
●出力Ch0の結果をEXCELと比較
図8‐55の枠内、-25-360 = -385となり、さらに16倍で‐6160となり、EXCEL(図8‐51)の左上の値と一致します。 |
図8‐55 シミュレーションで出力ch0の各画素を確認
次のページへ
目次へ戻る
|