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に移植します。
次のページへ
目次へ戻る |