6-03 まずは小数で畳み込みニューラルネットワーク

 第2部では畳み込みニューラルネットワークのハードウエア化に挑戦しますが、そのロードマップは第1部と同じで、まずは普通に小数演算で画像認識を試みます。


●第1部と同様にMNIST画像で推論する

 この書籍の8章のアーカイブに
half_float_network.pyというPythonで書かれたプログラムがあります。その中で「MNIST」と呼ばれる画像データセットを使用しますが、図6-07にテスト画像の最初の8枚を示します。画素は28x28で、7、2、1、0、4、1、4、9と続きます。
  図6-07 MNISTテストデータの最初の8枚


Pythonを走らせて正解率を見る

 MNISTのテスト画像は10,000枚あり、それらすべてを畳み込みニューラルネットワークにかけて推論します。図6-08はその実行結果で、正解率(Accuracy)は0.9935(
99.35%)になりました。
 第1部の全結合ニューラルネットワークでは93.52%だったので、誤認識率が6.48%→
0.65%と大幅に改善されています。なお、Pythonの実行環境としてAnacondaのJupyter Labを使用しました。
 また、Affine: out of Conv以下は最初の8枚の推論結果です。図6-07と一致していることが分かります。



  図6-08 half_float_network.pyの結果


●EXCELに移植して計算してみる

 分かりやすく説明するために、half_float_network.pyで行われている演算の一部をこのEXCELに移植しました。

 1シート目(X0withPad)はMNISTのテスト画像の最初の1枚にパディングを施したものです。数字の7であることが分かります(図6-09)。


  図6-09 MNISTの最初の1枚は「7」。それをパディングで30x30に拡げる


●フィルタ演算しやすいように画像データを並び替え

 図6-09の画像データを図6-10のように784×9の行列に展開します(2シート目im2col)。こうすることにより、フィルタ係数との「畳み込み」が「
行列の乗算」になります。これはim2colという関数(half_float_network.pyで使用)で行われる操作をEXCELに移植したものです。


  図6-10 フィルタ係数3×3=9個と行列演算できるように画像データを展開

●フィルタ係数とオフセットのシート

 フィルタはそれぞれ3×3の行列ですが、それを1列に並べます。フィルタは全部で
16個あるので図6-11のように9×16の行列になります(3シート目W1_Offset)。
 また同シートではオフセットも16個書かれています。



  図6-11 W1_Offsetはフィルタ係数とオフセットのシート

●畳み込みの結果は16画像ぶん

 4シート目im2col_W1は行列乗算の結果、すなわち畳み込みの結果です(図6-12)。フィルタが16個あることにより、結果は画像16枚(16チャネル)ぶんになります。


  図6-12 行列演算の結果は16チャネルぶん得られる


●正の値だけピックアップするRelu関数

 5シート目plusOffsetはオフセットを加算したものです。6シート目Reluは負の値を捨てて0としたもの(
Relu関数)の結果です(図6-13)。これが畳み込み1層目の出力になります。


  図6-13 Reluの出力。これが最初の畳み込み層の結果になる


●次節はハードウエア化を見越した「整数化」

 今回は一層目の畳み込み層のみ、画像データはMNISTの最初の1枚のみをEXCEL化しましたが、演算のイメージや行列のボリューム感などが分かりやすくなったと思います。
 次節ではこれらの演算の「整数化」を図ります。

目次へ戻る