FC2カウンター FPGAの部屋 畳み込みニューラルネットワークのコードを書く時の検証方法

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

FPGAの部屋

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

畳み込みニューラルネットワークのコードを書く時の検証方法

白線間走行用の畳み込みニューラルネットワーク(CNN)をVivado HLS で高位合成するために最適と思われるC ソースコードを書いたのだが、今回 Max Pooling のところでソースコードにバグがあった。
max_pooling.cpp が間違っていて、2 x 2 のウインドウでの最大値を取るはずが左上の値を取るコードになっていた。(”AXI4-Stream インターフェースのMax Pooling 1(ソースコード)”参照)
問題はどうやってソースコードが間違っているのか?を検証することだと思う。これほど間違っていても、最終的な出力では、最大 1.7 % 程度の精度の差があるだけである。(”AXI4-Stream インターフェースの畳み込みニューラルネットワーク5(モードの変更)”参照)

CNN をハードウェア化していなければ、TensorFlow やChairer などのフレームワークを使用していて、自分でプログラミングすることは無いと思われるので、コードを検証することは無いのだろうが、ハードウェアにする場合は、自分の書いたコードが正しいかどうかを常に確認する必要がある。特に、Vivado HLS に特化したソースコードを書くために複数の異なるコードを試すことはよくあるのだ。
TensorFlow やChairer などのフレームワークに重みとバイアスを変換して渡して推論させても、量子化出来なければ、値の比較はできない。
下の図で mp_fout[78][2] が量子化していない浮動小数点数の値で、mp_out[78][2] が量子化してある任意精度固定小数点データ型の値だ。2つの数には、1 以上の開きがある。これは、最初に畳み込み層の重みとバイアスを -1 ~ +1 までに量子化したためだ。
Max_Pooling_9_180225.pngMax_Pooling_10_180225.png

と言う訳で、任意精度で量子化できないと比較できない。(任意精度で量子化できるようだったら教えてください。特にTensorFlow はできるのかな?)

そこで、現在のソースコードはHLSストリームに最適化されているのだが、CNN を分割せずにソースコードを見たときに分かりやすいコードで書いたプログラムがあるので、それをHLSストリーム対応に変更し、各層に分割して比較してみようと思っている。(”カーブ、直線用白線間走行用畳み込みニューラルネットワーク13(AXI4 Stream版CNN IP 1”参照)

これで検証の方針は決まったのだが、CNN は多少コードを間違っていても、大した影響はない。ということは、ポイントを外さなければハードウェアに都合の良いように途中のアルゴリズムを変更しても、それほどの問題はないということかもしれない?それをおいおい確かめてみようと思う。

ちなみになぜ面倒に各層をHLSストリームでつないでいるのか?というと、自由に各層をつなげて、いろいろな層構成を書くことが簡単に行えるようにするためである。つまり、各層を部品として使えるようにするためだ。
  1. 2018年04月23日 05:06 |
  2. DNN
  3. | トラックバック:0
  4. | コメント:0

コメント

コメントの投稿


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

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