FC2カウンター FPGAの部屋 白線追従走行用畳み込みニューラルネットワークの製作14(固定小数点用に量子化)

FPGAやCPLDの話題やFPGA用のツールの話題などです。 マニアックです。 日記も書きます。

FPGAの部屋

FPGAの部屋の有用と思われるコンテンツのまとめサイトを作りました。Xilinx ISEの初心者の方には、FPGAリテラシーおよびチュートリアルのページをお勧めいたします。

白線追従走行用畳み込みニューラルネットワークの製作14(固定小数点用に量子化)

白線追従走行用畳み込みニューラルネットワークの製作13(9075枚のトレーニング用画像データで学習)”の続き。

前回は、9075 個のトレーニング用画像データと4125 個のテスト用画像データを使用して学習を行った。その結果、CONV数が 2 の畳み込みニューラルネットワークで、93.1 % の精度を得ることができた。今回は、その畳み込みニューラルネットワークを固定小数点用に量子化し、Vivado HLS に使用する重みやバイアスのヘッダファイルを生成しよう。

最初に、今まで使ってきたDLFS_Chap7_integer.ipynb のPython コードで量子化を行った。
wlt_cnn_75_170825.png

wlt_cnn_78_170825.png

固定小数点用に量子化したときの精度は約 91.9 % だった。浮動小数点数演算の場合は 93.1 % だったので、1.2 % 精度が落ちている。
この時の量子化ビット数は、MNISTの手書き数字認識の時よりも、畳み込みの精度を変えている。最大10.3 位の値が出るので、符号も併せて整数部(COV_OUT_INT)を 5 ビット、小数部(COV_OUT_MAG)を 4 ビットとした。
wlt_cnn_76_170825.png

この時のデバックモードの出力の一部を示す。

(100, 1, 10, 56)
Conv col.shape = (31200, 25)
Conv col_W.shape = (25, 2)
Conv np.max(x) = 0.9686274528503418
Conv np.min(x) = 0.29411765933036804
(2, 1, 5, 5)
Conv np.max(self.W_int) = 0.54296875
Conv np.min(self.W_int) = -0.01171875
(2,)
Conv np.max(self.b_int) = 0.0
Conv np.min(self.b_int) = -0.46484375
Conv out.shape = (31200, 2)
Conv np.max(out) = 10.408639731584117
Conv np.min(out) = 0.00032169173937290907
Conv np.max(out2) = 10.4375
Conv np.min(out2) = 0.0
Conv out.reshape = (100, 2, 6, 52)
Pooling x.shape = (100, 2, 6, 52)
Pooling out.shape = (100, 2, 3, 26)
x shape =(100, 2, 3, 26)
np.max(self.W) = 0.3530595475749049
np.max(self.W) = 0.3530595475749049
np.max(self.b) = 0.16036682979180678
x reshape =(100, 156)
np.max(x) = 10.4375
np.min(x) = 0.0
(156, 100)
np.max(self.W_int) = 0.3515625
np.min(self.W_int) = -0.3046875
(100,)
np.max(self.b_int) = 0.16015625
np.min(self.b_int) = -0.1484375
(100, 100)
np.max(out) = 8.645263671875
np.min(out) = -4.50537109375
np.max(out2) = 8.65625
np.min(out2) = -4.46875
x shape =(100, 100)
np.max(self.W) = 0.38870702647190525
np.max(self.W) = 0.38870702647190525
np.max(self.b) = 0.12107604495322784
x reshape =(100, 100)
np.max(x) = 8.65625
np.min(x) = 0.0
(100, 3)
np.max(self.W_int) = 0.390625
np.min(self.W_int) = -0.5390625
(3,)
np.max(self.b_int) = 0.12109375
np.min(self.b_int) = -0.09765625
(100, 3)
np.max(out) = 7.540771484375
np.min(out) = -8.2576904296875
np.max(out2) = 7.53125
np.min(out2) = -8.21875


大体良いと思うので、Vivado HLS に使用する重みやバイアスのヘッダファイルを生成した。これはMNISTの手書き数字認識と同じPython コードを使用している。これについては、”「ゼロから作るDeep Learning」の畳み込みニューラルネットワークのハードウェア化3”を参照してほしい。

畳み込み層の重みのファイル名は、conv1_weight.h、バイアスのファイル名は conv1_bias.h、1層目の全結合層のファイル名は af1_weight.h、バイアスのファイル名は af1_bias.h、2層目の全結合層の重みファイル名は af2_weight.h、バイアスのファイル名は af2_bias.h となっている。これらのファイルを生成することができた。
wlt_cnn_77_170825.png
  1. 2017年08月25日 03:57 |
  2. DNN
  3. | トラックバック:0
  4. | コメント:0

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック URL
http://marsee101.blog19.fc2.com/tb.php/3894-aa7de338
この記事にトラックバックする(FC2ブログユーザー)