FC2カウンター FPGAの部屋 TensorFlow + Kerasを使ってみた14(Vivado HLSで実装2)
FC2ブログ

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

FPGAの部屋

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

TensorFlow + Kerasを使ってみた14(Vivado HLSで実装2)

TensorFlow + Kerasを使ってみた13(Vivado HLSで実装1)”の続き。

前回は、今ままでの重みやバイアス、そして、MNISTのデータの一部を記述した C ヘッダを使用して、”今まで作ってきた層のテンプレートをMNIST のCNN に適用する3(Export RTL まで)”のVivado HLS プロジェクトに適用してみたが、C シミュレーションをした時に、ほとんどのデータがエラーになってしまった。今回は、その原因を追求して原因を突き止めた。そして、もう一度、C シミュレーションを行ったところNo Error だった。成功した。

まず、前回のエラーはどこが原因なのか考えたところ、flatten 層でフラット化してるのだが、MaxPooling層のどこが全結合層のどこに接続されているか?ということだった。Keras では下の図を見ると、MaxPooling層の (None, 12, 12, 10) がFlatten 層で (None, 1440) に変換されている。つまり、MaxPooling 層では、処理された画像の高さ (12)、画像の幅 (12) 、チャネル数 (10) の配列ということになる。そうなると前結合層の重みを取り出したの配列数の (1440, 100) の 1440 の内訳は処理された画像の高さ (12)、画像の幅 (12) 、チャネル数 (10) の配列のはずである。それじゃまずい。想定してる配列の順番は、チャネル数 (10) 、画像の高さ (12)、画像の幅 (12) なので、重みの配列の順番を入れ替える必要があるということが分かった。
tensorflow_keras_64_180606.png

そこで、”TensorFlow + Kerasを使ってみた11(全結合層の重みをC のヘッダに変換)”の全結合層1層目の重みをC ヘッダにする部分のPython コードを以下の様に変更した。

fwrite_af_weight(dence_layer1_weight, 'af1_weight10.h', 'af1_fweight', 'af1_weight', MAGNIFICATION_AF)
MAGNIFICATION_AF = 2 ** (9-1)
print(dence_layer1_weight.shape)
dence_Layer1_w12_12_10_100 = np.reshape(dence_layer1_weight,(12,12,10,100))
dence_Layer1_w201 = dence_Layer1_w12_12_10_100.transpose(2,0,1,3)
dence_Layer1_w1440_100 = np.reshape(dence_Layer1_w201,(1440,100))
fwrite_af_weight(dence_Layer1_w1440_100, 'af1_weight10.h', 'af1_fweight', 'af1_weight', MAGNIFICATION_AF)



これで作成された全結合層1層目の重みをC ヘッダにした af1_weight10.h を示す。
tensorflow_keras_51_180601.png
tensorflow_keras_52_180601.png

この全結合層1層目の重みを Vivado HLS の mnist_conv_nn10_hlss_k プロジェクトに適用した。
(2018/06/07 : 修正、デバックのために、NUM_ITERATIONS に 1 を設定していたので、エラーが 0 だった。 300 を設定するとエラーが出るようになった)
C シミュレーションを行ったところ、300 個の テストデータに対して、ソフトウェアのfloat 演算は 3 個、ハードウェアの固定小数点演算は 6 個のエラーが出た。ちなみに、ハードウェアの量子化ビット幅は以前使用したものをそのまま使用している。
tensorflow_keras_65_180606.png

精度を計算してみよう。
ソフトウェアのfloat 演算のエラー数は 3 個なので、 (300 - 3) / 300 x 100 = 99 %
ハードウェアの固定小数点演算は 6 個なので、 (300 - 6) / 300 x 100 = 98 %

これで、Keras から重みやバイアスをVivado HLS のCNN に移すことが出来たと思うが、ビット幅の検討をする必要がある。
  1. 2018年06月06日 04:56 |
  2. TensorFlow, Keras
  3. | トラックバック:0
  4. | コメント:0

コメント

コメントの投稿


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

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