9‐05 4層目シミュレーションとEXCELの答え合わせ

●4層目は出力が128chになる

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

図9-50 128chの結果が同時に出てくる

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

 図9‐51は4層目のEXCELファイル(TS_layer4.xlsm)の
im2colAll_W4シートです。これは行列乗算の64枚のシートim2col00_W4〜im2col63_W4を足し込んだものです(入力が64chなので64枚足し込んで1枚)。

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

図9-51 im2colAll_W4シートと比較

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

 図9‐51の左上の-20992に注目し、その値を求める過程を見てみます。図9‐52はconv_layer4/dotpro_000_00(積和演算器)の信号です。
 同図の左の枠内PixRomData(画像データ)が31、MatRomData(重み係数)が-1、
mulout(乗算結果)が-31になっています。
 右の枠内はPixRomDataが6、MatRomDataが1、muloutが24になっています。

図9‐52 係数は2ビット。11なら-1倍、01なら4倍

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

 4層目の係数は2ビットにエンコードされており、まとめると次の表のようになります。「本来乗算されるべき値」の
1/16が乗算されています。
係数(2進) 係数(10進) 乗算される値 本来乗算されるべき値
01 1 4 64
00 0 1 16
11 -1 -1 -16
10 -2 -4 -64
  表9‐01 乗算結果は本来の1/16の値になることに注意

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

 図9‐53では3×3×16ch=144サイクル(1440ns)かけて積和が行われ、MATMULOUT(mac_000_00と同じ信号)の右端に-442が出ています。4層目はこの図のように積和演算器4つで出力1chを計算するので、このmac_000_00にもう三つの積和結果mac_000_01, 02, 03を足します。

図9‐53 カーネルは3×3、入力16chぶん144回の積和をする

●4ビット左シフトして16倍

 図9‐54のようにHDLではmac_000_00, 01, 02を加算してMacAll_000として、更に16倍してMacShift_000とします。各積和演算器で値が1/16なっている(表9‐01)のを相殺します。

図9‐54 conv_layer4.vhdの一部

●出力Ch0の結果をEXCELと比較

 図9‐55の枠内、-442-50-579-241 = -1312となり、さらに16倍で‐20992となり、EXCEL(図9‐51)の左上の値と一致します。

図9‐55 シミュレーションで出力ch0の各画素を確認

次のページへ

目次へ戻る