FC2カウンター FPGAの部屋 「ゼロから作るDeep Learning」の2層ニューラルネットワークのハードウェア化1

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

FPGAの部屋

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

「ゼロから作るDeep Learning」の2層ニューラルネットワークのハードウェア化1

「ゼロから作るDeep Learning」以前、すべての章をご紹介した。とっても良い本だ。

その5章 誤差逆伝播法の2層のニューラルネットワークをハードウェア化してFPGA に実装してみようと思う。
学習はdeep-learning-from-scratch/ch05/ のtrain_neuralnet.py のコードをそのまま使用する。
このままでは浮動小数点数なので、指定されたビット長の固定小数点に量子化するメソッドをtwo_layer_net.py、layers.py に追加してある。それが、two_layer_net_int.py、layers_int.py だ。
nn_fpga_ch5_1_170602.png

上の図のように Class Relu に def forward_int が追加されているのが分かると思う。つまり、固定小数点に量子化してforward 処理を実行するメソッドを追加したわけだ。ただし、Relu はforward と同じだ。
MAGNIFICATION が量子化のビット長を表す。つまり、全体が 9 ビットで、整数部が1ビットを表す。RANGE が内積を取った後の整数部に拡張されるビット長を表している。これらはいろいろとやってみて、精度があまり落ちない値にしてある。

今回、def forward_int を書き換えたのは、class Affine だけだ。
重みやバイアスにMAGNIFICATION を掛けて、0.5 を加算して(四捨五入のため)integer に変換した後で、飽和演算を行う。すると小数点以下が切れてるので、量子化できることになる。そして、float に戻して、MAGNIFICATION で割っている。
その後、量子化の目安のため値のmax と min を表示している。
nn_fpga_ch5_2_170602.png

先ほど書いたように、train_neuralnet.py の学習はそのまま使って、two_layer_net_int.py にも def loss_int や def predict_int、def accuracy_int を追加してあるので、固定小数点に量子化してforward 処理したときのaccuracy(精度)を確認することができる。
nn_fpga_ch5_3_170602.png
nn_fpga_ch5_4_170602.png

その出力を示す。

0.17975 0.1722
0.904483333333 0.9106
0.9247 0.9279
0.9357 0.9352
0.94515 0.9425
0.95155 0.9506
0.956733333333 0.9527
0.95995 0.9564
0.9649 0.9615
0.9663 0.9609
0.968883333333 0.9632
0.972766666667 0.9655
0.973883333333 0.9665
0.97535 0.968
0.97635 0.9678
0.9784 0.9696
0.979483333333 0.9692

(60000, 784)
np.max(x) = 1.0
np.min(x) = 0.0
(784, 50)
np.max(self.W) = 0.42578125
np.min(self.W) = -0.53515625
(50,)
np.max(self.b) = 0.28515625
np.min(self.b) = -0.22265625
(60000, 50)
np.max(out) = 10.925199185698148
np.min(out) = -12.404212626584922
np.max(out2) = 10.92578125
np.min(out2) = -12.3984375
(60000, 50)
np.max(x) = 10.92578125
np.min(x) = 0.0
(50, 10)
np.max(self.W) = 0.99609375
np.min(self.W) = -1.0
(10,)
np.max(self.b) = 0.421875
np.min(self.b) = -0.39453125
(60000, 10)
np.max(out) = 30.527862548828125
np.min(out) = -28.802261352539062
np.max(out2) = 15.99609375
np.min(out2) = -16.0
(10000, 784)
np.max(x) = 1.0
np.min(x) = 0.0
(784, 50)
np.max(self.W) = 0.42578125
np.min(self.W) = -0.53125
(50,)
np.max(self.b) = 0.28515625
np.min(self.b) = -0.21875
(10000, 50)
np.max(out) = 10.473299672572466
np.min(out) = -10.355300247856576
np.max(out2) = 10.47265625
np.min(out2) = -10.3515625
(10000, 50)
np.max(x) = 10.47265625
np.min(x) = 0.0
(50, 10)
np.max(self.W) = 0.99609375
np.min(self.W) = -0.99609375
(10,)
np.max(self.b) = 0.421875
np.min(self.b) = -0.390625
(10000, 10)
np.max(out) = 29.088897705078125
np.min(out) = -24.532501220703125
np.max(out2) = 15.99609375
np.min(out2) = -16.0
0.9774 0.9636


最後の”0.9774 0.9636”が固定小数点で量子化した場合のaccuracy だ。浮動小数点で計算したときのaccuracy は”0.979483333333 0.9692”なので、少し下がっているのが分かると思う。
  1. 2017年06月02日 04:55 |
  2. Vivado HLS
  3. | トラックバック:0
  4. | コメント:0

コメント

コメントの投稿


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

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