11-02 畳み込み2〜6層目の画像データを4ビットに削減

 前節ではRAMリセットの記述を削除して回路規模を減らしましたが、まだロジック部容量の100%を超えています。


●画像データは本当に8ビットも必要なのか?

 この時点で画像データを整数化しましたが、そのビット数は8であり、0〜255までの値をとり得ました。

 またこの時点で畳み込み2層目以降の重み係数を4種類(-64, -16, +16, +64)に絞りました。それを鑑みると、画像データのビット数を削減しても認識率が落ちない可能性があります。そこで図11-11のように
2層目以降は画像データを8ビット→4ビットと減らすことを考えます。


  図11-11 灰色の層の画像データのビット数を減らしてみる


●ビット数を減らしても正解率はほとんど変わらない!

 正解率は
Pythonで確認します。畳み込み1層目が終わった時点の画像データを8ビット→4ビットと削減して0〜15の範囲に収めます。
 画像データが以前の1/16になるので、バイアスの値も1/16にしてレベル合わせしてから足しこみます。

 変更したPythonプログラムをAnacond Jupyter Labで実行した結果を図11-12に示します。正解率は
98.53%とほとんど変わりません(*1)。
 したがって2層目以降のビット数を8から4に減らしても問題ないことが分かり、回路規模(DF/Fの数やRAMの容量)が何割か減らせそうです。

(*1)以前は98.28%だったのでむしろ若干上がっている



  図11-12 Pythonでテスト画像を10,000枚認識させて9,853枚正解した


●各層ごとにEXCELに移植

 
PythonをEXCELに移植したものを以下に示します。全部で7個あります。

 conv_layer1.xlsm : 畳み込み1層目
 conv_layer2.xlsm : 畳み込み2層目
 conv_layer3.xlsm : 畳み込み3層目
 conv_layer4.xlsm : 畳み込み4層目
 conv_layer5.xlsm : 畳み込み5層目
 conv_layer6.xlsm : 畳み込み6層目
 affine_layer12.xlsm : Affine 1, 2層目

 vbaoutput.zip : VHDLを自動生成する際必要となるフォルダ

●積和演算後に4ビット多く切り捨てる

 積和演算の後は従来、8ビット右シフトしていましたが(ここにその理由)、
conv_layer1.xlsm(畳み込み1層目)のtruncateシートを見ると12ビット右シフトされています(図11-13)。これにより画像データは従来の1/16になります。



  図11-13 conv_layer1.xlsmのtruncateシート。8ビット+4ビット=12ビット右シフトさせる


●リミッタをかけて4ビットの範囲に収める

 その後
Reluシートでリミッタをかけ、最大値は15で飽和します。これにより2層目以降の入力画像データは4ビット、0〜15の範囲に限定されます(図11-14)。



  図11-14 Relu関数のところでリミッタをかける


●画像が1/16になったのでバイアスも1/16にする

 図11-15はplusBiasシートです。画像のレベルが1/16になったことを鑑みると、そのままバイアスを足すとその影響力が16倍になってしまいます。したがって
バイアスも1/16にしてから加算します。



  図11-15 plusBiasシート。バイアスも1/16にする


●Affine2層目の結果を確認

 図11-16は最後の
affine_layer12.xlsm(Affine2層目)のCalculateシートです。a8の行を見ると図11-12の1番上の列とピタリ一致しています。判定結果Answerはとなっており、正解しています(MNISTテスト画像の最初の1枚は’7’)。



  図11-16 affine_layer12.xlsmのCalculateシート。Pythonと結果が一致する


次のページへ


目次へ戻る