6-04 整数化してもほとんど認識率が落ちない!

 第2部の目的は畳み込みニューラルネットワークをFPGAに実装することです。FPGAで小数の演算は行えないため、half_float_network.py内の変数をすべて「整数化」します。


●入力画像データを整数化する

 まずは入力されるテスト画像を整数化します。リスト6-01のようにload_mnistの引数
normalizeをTrueからFalseに変更すると、画像データはリスト6-02のように0〜255までの整数になります。

 リスト6-02のカッコ内は整数化する前の値です。これは(0.0〜1.0)の範囲が[0〜255]の範囲に写像されたことを意味します。




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

 またリスト6-03のようにフィルタの行列col_W、バイアスの配列self.bを
256倍し(*1)、型をintにするとそれらはリスト6-04のように整数になります。

(*1)整数化後の絶対値を255以下に収めるために255.9を乗算している。またcol_Wは絶対値が1.0を超えるものがあるのでリミッタをかける

 リスト6-04のカッコ内は整数化する前の値です。(-1.0〜+1.0)の範囲が[-256〜+255]の範囲に写像されています。




●積和演算の直後に8ビット右シフトさせる

 上述のように(-1.0〜+1.0)は整数化によって[-256〜+255]に写像されます。これはフィルタ係数やバイアスの値が整数化によって
256倍になることを意味します。

 また入力画像データの値も整数化によって
256倍になります。それはフィルタ係数と乗算されるので、その結果の値は65,536倍になってしまいます(図6-15)。バイアスの値は256倍のままなので、そのまま加算するとバイアスの影響力が1/256になってしまいます。したがってリスト6-05のように8ビット右シフトさせてからバイアスを加算します。

  図6-15 乗算後ビットシフトが必要な理由



●Reluの結果が255を超えないように飽和させる

 畳み込み1層目の入力画像のとり得る範囲は0〜255です。2層目以降の入力画像もこの範囲にとどまるよう、Reluの後にリミッタをかけます。リスト6-06のように
最大255で飽和させます。


●整数化した値をファイルに落とす

 リスト6-06のように変更するとテスト画像、フィルタ係数、バイアスをファイルに書き出すことができます。後々EXCELに貼り付けるのでCSVファイルでセーブします。


正解率はほとんど落ちていない!

 図6-16は整数化したプログラムを実行した結果で、正解率(Accuracy)は0.9884(
98.84%)になりました。整数化前は99.35%だったので0.5%ほどしか劣化していません!
 またAffine: out of Conv以下はMNISTの最初の8枚の推論結果です。すべて正解、しかも相当余裕を持って正解していることが分かります。



  図6-16 実行結果(整数で計算)


 次のページでは整数化した状態でEXCELに移植します。

次のページへ


目次へ戻る