9-01 Affine(全結合)層をEXCEL化する


●畳み込み6層の後に全結合が2層ある

 今回ハードウエア化を試みる畳み込みニューラルネットワークの全体像を図9-01に示します。この書籍の8章、
half_float_network.pyというPythonプログラムの流れをブロック図にしたものです。


 図9-01 処理の全体像。畳み込みが6層、その後全結合が2層ある


Affine1層目と2層目のEXCEL化

 まずはAffine(全結合)層をPythonからEXCELに移植します(ここにそのファイル)。図9-02にEXCEL表の最初のシートを示します。このシートで計算を行います。
 第1部で全結合ニューラルネットワークをEXCEL化しましたが、それとの主な違いは、シグモイド関数の代わりに
ReLU関数を用いるところです。



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

●MNISTの最初の数字は”7”

 上図のDrop1行(*1)がAffine1層目の結果、a8行がAffine2層目の結果です。a8が最大になるのが7番目なのでanswerは”
”(*2)、これが「畳み込みニューラルネットワーク」の最終結果になります。図9-03はMNISTのテスト画像の最初の一枚で、数字の7であり、正解であることが分かります。

(*1)Dropoutの結果。この例おいてはReLU結果を0.5倍して出力するだけ。

(*2)SoftMaxの結果でこれが推論値。最大値が何番目かを出力する。その前のDropoutは省略してある



 図9-03 MNISTの最初の画像


●Phtyonと同じ結果になることを確認

 図9-04は
Pythonでの推論結果です。最初の行がMNIST1枚目(数字の7)で、図9-02のa8行とピタリ一致していることが分かります。



 図9-04 Pythonでの推論結果(MNIST最初の8枚)


●Affine1層目の重み行列は1024×50

 畳み込み6層目の結果は64チャネル、それぞれ4×4画素でした。それらを
横一行に並べたものが図9-02のx_in行で、4x4x64 = 1024列にわたります。
 したがってそれらに乗算する重み係数は図9-05のように1024行となります。同図では列が50列なので行列乗算の結果は1行×50列になります。


 図9-05 シートW1がAffine1層目の重み行列


●Affine2層目の重み行列は50×10

 Affine1層目の結果は1行×50列なので、それらに乗算する重み係数は図9-06のように50行となります。同図では列が10列なので行列乗算の結果は1行×10列になります。


 図9-06 シートW2がAffine2層目の重み行列



目次へ戻る