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枚正解した
●積和演算後に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は7となっており、正解しています(MNISTテスト画像の最初の1枚は’7’)。 |
図11-16 affine_layer12.xlsmのCalculateシート。Pythonと結果が一致する
次のページへ
目次へ戻る |