●EXCELの整数版を見てみる

 このEXCELは一層目の畳み込み層をすべて
整数で演算します。
 1シート目(X0withPad)はMNISTのテスト画像の最初の1枚にパディングを施したものですが、値がすべて整数であることが分かります(図6-17)。


  図6-17 入力画像の値すべて整数になっている(パディングで30×30画素)


●フィルタ係数とバイアスを整数化する

 2番目のシートim2colは画像データを784×9の行列に展開したもの、3番目のシートW1_Offsetはフィルタ係数とバイアスです(図6-18)。値がすべて整数になっています。


  図6-18 フィルタ係数とオフセットも整数


●整数で行う畳み込みの結果

 4シート目im2col_W1は行列乗算の結果、すなわち畳み込みの結果です(図6-19)。整数同士の乗算なので大きな値になっています。


  図6-19 整数同士の乗算で大きな値になる


●バイアスとの加算の前に右シフトでレベル合わせ

 5シート目truncateは
8ビット右シフトした値です(図6-20)。前のシートと比べて値が1/256になっており、この後にバイアスを加算します。


  図6-20 整数同士乗算したらすぐビットシフトする


●畳み込みで得られる画像の1枚目

 6シート目plusOffsetでオフセット加算、7シート目でRelu、8シート目outCh0はReluの1列目を28×28の行列に並び変えたものです(図6-21)。これが畳み込み1層目の出力になります。


  図6-21 Reluの1列目を平面的に並べたもの


●PythonとEXCELの演算結果が一致するか確認

 図6-21の計算をPythonで行ったものが図6-22です。値が
ピタリ一致していることが分かります。


  図6-22 Pythonから畳み込みの結果を書き出す

●EXCELでやったことをVHDLでやればよい

 PythonとEXCELの演算結果がピタリ一致したことにより正しく移植できていることが分かりました。次章ではEXCELから
VHDLに移植します。
 「畳み込みニューラルネットワーク」は複雑ではありますが、所詮は整数の掛け算と足し算です。PythonだろうがEXCELだろうがVHDLだろうが、結果が変わる理由はありません。丁寧に進めれば必ず一致させることができます。


目次へ戻る