1-05 PythonからEXCELに移植してみる

 前節でPythonのプログラムを整数化しましたが、ここではそれをEXCELに移植します(ここにそのファイル)。図1-15にEXCEL表の最初のシートを示します。このシートで計算を行います。



 図1-15 EXCEL表の最初のシート。ここで演算を行う

●入力データと重み行列を乗算する

 x_inは入力される画像データです。28×28画素を横一列に
784個並べます。x_inは行列W1(2枚目のシート、図1-16)と乗算されます。W1の要素数は784×50なので、乗算結果の要素数は50になります。



 図1-16 EXCEL表の2番目のシート。重みの行列W1


●8ビットシフト→バイアス加算→シグモイドで1層目終了

 最初のシートのx_in * W1は行列との乗算結果ですが、それをPythonと同様に8ビット右シフトします。その結果がtruncateで、要素数50の配列になります。

 truncateの後、b1(バイアス)を加算し、a1となります。これも要素数50の配列です。

 a1は擬似シグモイド関数にかけられ、z1となります。これも要素数
50の配列です。これで1層目のニューラルネットワーク演算の終了です。


2層目の演算

 1層目の結果z1は行列W2(3枚目のシート)と乗算されます。W2の要素数は
50×100なので、乗算結果の要素数は100になります。

 図1-17のz1 * W2が乗算結果で、これを8ビット右シフトしたものがその下のtruncateで要素数100の配列になります。

 truncateの後、b2(バイアス)を加算し、a2となります。これも要素数100の配列です。

 a2は擬似シグモイド関数にかけられ、z2となります。これも要素数
100の配列です。これで2層目のニューラルネットワーク演算の終了です。



 図1-17 EXCEL表の最初のシート(後半)

●3層目で推論が終了

 2層目の結果z2は行列W3(4枚目のシート)と乗算されます。W3の要素数は
100×10なので、乗算結果の要素数は10になります。

 図1-17のz2 * W3が乗算結果で、これを8ビット右シフトしたものがその下のtruncateで要素数10の配列になります。

 truncateの後、b3(バイアス)を加算し、a3となります。これも要素数10の配列です。

 
a3の1番目の要素は数字の0、2番目は数字の1、・・・10番目は数字の9に相当します。
 その下のrankingはa3の各要素の順位です。
2903が一番大きいのでそのrankingが1になっています。

 answerはrankingが1の数字で
「7」、これが推論結果になります。入力データを画像化すると図1-18になっているので正解だということが分かります。



 図1-18 テスト画像の最初の1枚は「7」

●PythonでもEXCELでも全く同じ値になるはず

 Pythonのプログラムから書き出した
a3値のファイルを図1-19に示します。10個の要素すべてピタリと一致しています。複雑な演算に見えますが所詮は整数の掛け算と足し算です。EXCEL化しても同じ値になるのは当然ですし、今後VHDL化しても結果が変わる理由はありません。



 図1-19 Pythonで計算した推論結果も同じ値


●整数で演算なので途中経過も結果も一致する

 演算結果が合わない場合はPythonプログラムから
途中経過を書き出して比較してみましょう。丁寧にやれば必ず一致するはずです。


●x_inの行を他の画像に変えて推論してみる

 2番目のテスト画像は’2’、3番目は’1’ですがそれらでも試してみました。以下の画像をクリックするとEXCEL表をダウンロードできます。
x[1] x[2]
 図1-20 テスト画像の2番目x[1]と3番目x[2]

 いずれも推論結果answerは正解、a3の値もPythonの整数版とピタリ一致しています。 

目次へ戻る