Deep Neural Network

Caffe | Deep Learning Frameworkをインストール1
Caffe | Deep Learning Frameworkをインストールしてみようと思う。インストールするのは、VirtualBox上のUbuntu 14.04 LTS で、NVIDIAのGPUも無いので、CPU ONLY とする。
Caffe | Deep Learning Frameworkをインストール2
前回、Deep Learning の Caffe をインストールしようとしたが、runtest でエラーが出てしまった。
今回は、異なるパソコンに Caffe をインストールしてみたところ、Windows 7にVirttualBoxでUbuntu14.04LTSをインストールして、Unity GUIで使用しているパソコンでうまくインストールすることができた。
”Caffeで手軽に画像分類”の”リファレンスモデルでの分類”をやってみた
前回、”Caffeで手軽に画像分類”の”リファレンスモデルでの分類”が動作したので、 101_ObjectCategories/airplanesの画像を分類してみました。
”Caffeで手軽に画像分類”の”Caffeを特徴抽出器として使った分類”をやってみた1
”Caffeで手軽に画像分類”の”Caffeを特徴抽出器として使った分類”をやってみるこ とにした。

と深層学習」をやってみる 1(CHAPTER 1 ニューラルネットワークを用いた手書き文字認識)
とっても良い資料の「ニューラルネットワークと深層学習」をやってみよう。
そのうちの、「CHAPTER 1 CHAPTER 1 ニューラルネットワークを用いた手書き文字認識」をやってみる。

「ゼロから作る Deep Learning」をやってみる1(Numpyと matplotlib の使い方)
「「PYNQ祭り」延長戦 : FPGAディープラーニング実践懇親会」に参加するためにDeep Learning Nerual Network (DLNN) を勉強することにした。
勉強するために「ゼロから作る Deep Learning」の本をやってみることにしたのだが、老眼で本を読むのがつらいので、オライリーの「ゼロから作る Deep Learning」のPDFを購入して、それを見ながらやってみることにした。
コードはオライリー・ジャパンのoreilly-japan/deep-learning-from-scratch にあって、MITライセンスなので、これをjupyter notebook ででやりながらやってみることにした。この本はとっても良い本なので、購入されて勉強することをお勧めする。
「ゼロから作る Deep Learning」をやってみる2(パーセプトロンでゲートを作る)
引き続き、オライリーの本「ゼロから作る Deep Learning」をやってみよう。コードはオライリー・ジャパンのoreilly-japan/deep-learning-from-scratch にあって、MITライセンスなので、これをjupyter notebook ででやりながらやってみることにした。
今日は、2章のパーセプトロンだ。ゲートをパーセプトロンで作っている。AND、NAND、OR
XOR は閾値が線形だと表せないので、パーセプトロンをつないで作っている。
「ゼロから作る Deep Learning」をやってみる3(3章 ニューラルネットワーク)
いよいよ3章のニューラルネットワークをやってみる。この章ではニューラルネットワークの推論 を簡単なコードで実行することがで来ている。Python って for が要らないことが多いので、コードも短い。
「ゼロから作る Deep Learning」をやってみる4(4章 ニューラルネットワークの学習)
今度はニューラルネットワークの学習だ。
ここでは、誤差逆伝播法を使ってなくて、すべての層の重みに関する損失関数の偏微分を行って傾きを求めて損失関数が小さくなる方向に重みを更新しているよう だ。これでも求められるが計算時間がかかるという欠点があるようだ。
「ゼロから作る Deep Learning」をやってみる5(5章 誤差逆伝播法)
今回は誤差逆伝播法だ。4 章では、数値微分で重みの学習を行ったが、この章では、誤差逆伝播法でニューラルネットワークの学習を行っている。数値微分法の方が誤差逆伝播法よりも約2万倍遅いという 結果が出た。衝撃的だった。その位の差があるようだ。。。
「ゼロから作る Deep Learning」をやってみる6(6章 学習に関するテクニック)
今回は学習に関するテクニックを学習した。
パラメータの更新方法で、SGD, Momentum, AdaGrad, Adm を学習した。重みの初期値についてや、Batch Nomalization。
正則化では、過学習に陥る条件やその解消方法としてWeight decay, Dropout を学習した。またハイパーパラメータの最適化について学習した。すべて実際のコードを見て、結果も見られるのが良いと思う。
「ゼロから作る Deep Learning」をやってみる7(7章 畳み込みニューラル ネットワーク)
今回は畳み込みニューラルネットワーク をやってみた。説明は分かりやすかった。
Convolution レイヤやPooling レイヤの実装を学習したが、いまいち頭に入っていないので、あとでもう一度、やってみることにする。
今までの全結合ニューラルネットワークと同様にPython で書けるのは素晴らしい。
畳み込みニューラルネットワークでMnist を学習したときのテストデータの正確さは 98.76 % だった。
「ゼロから作る Deep Learning」をやってみる8(8章 ディープラーニング)
今回は、ディープラーニングについて学習する。この辺りになると、論文の紹介が多くなる。概要 が見れてうれしい。
演習は畳み込みニューラルネットワーク2層、プーリング1層、畳み込みニューラルネットワーク2層、プーリング1層、畳み込みニューラルネットワーク2層、 プーリング1層、全結合1層、ドロップアウト1層、全結合1層、ドロップアウト1層の合計13層のディープラーニング・ニューラルネットワークを deep_convert.py で実装している。それを train_deepet.py で訓練すると、99.39 |% の正確さでMnist の数字を認識できた。
最後には、64ビット長の浮動小数点数を使ったときと、16 ビット長の浮動小数点数を使ったときの認識精度は変化が無かった。(half_float_network.py)

DnnWeaverをやって みる1
DnnWeaver をやってみようと思う。
DnnWeaver は、「FPGA上でディープニューラルネットワーク(DNN)を加速するための最初のオープンソースのフレームワーク」(Google 翻訳使用)だそうだ。

VirtualBox 上のUbuntu 16.04 にTensorFlow をインストールする
Vengineer さんにDnnWeaver は、TensorFlow をインストールすると make できるというのを教えて頂いたので、VirtualBox 上のUbuntu 16.04 にTensorFlow をインストールすることにした。

DnnWeaverをやって みる2
Vengineer さんにDnnWeaver は、TensorFlow をインストールすると make できるというのを教えて頂いたので、VirtualBox 上のUbuntu 16.04 にTensorFlow をインストールすることができた。
今回は、~/dnnweaver.public/fpga ディレクトリで make してみよう。
Vivado 2016.2 は2016.2 と2016.3 の間に壁があるので、インストールすることにして、インストールを行った。
DnnWeaverをやって みる3
前回は、エラーで終了してしまったので、今回はそのエラーの解消を図る。
DnnWeaverをやって みる4(「PYNQ祭り」延長戦の成果)
PYNQ祭り延長戦で分かったDnnWeaver の構成とその後、私が解明した事実を書いておく。
DnnWeaverをやって みる5(Windows 10 のVivado 2016.2でやってみた1)
今まで、DnnWeaver のVivado 2016.2 のGUI では、トップレベルにいろいろなソースコードが入っていたので、これをスクリプトでまとめてビットファイルを生成していたのかと思っていた。しかしよく見てみると、 zynq_wrapper.v の下に階層構造ができている。
DnnWeaverをやって みる6(Windows 10 のVivado 2016.2でやってみた2)
前回は、ZYNQ7 Processing System を含むブロックデザインをPYNQボード用に変更した。今回は、ビットファイルを生成して、SDKでPYNQボードにビットファイルを書き込んで、アプリケーションソフト をコンパイルして試してみたい。

BNN-PYNQ のトレーニングを試してみる1
BNN-PYNQ は以前もやったのだが、今回はトレーニングを試してみることにした。
BNN-PYNQ/bnn/src/training/ を参考にしてやってみることにした。
ただし、GPU は持っていないので、CPU のみでやってみる。
BNN-PYNQ のトレーニングを試してみる2
前回は、Theano やpylearn2 をインストールして、mnist のトレーニングを行った。33時間20分かかってトレーニングが終了した。
今回は、その結果を見ていこう。
BNN-PYNQ のトレーニングを試してみる3
前回は、MNISTのトレーニングをして、それをバイナリ化した。今回は、”マウスコンピュー ターのパソコンにHDDとGPUを追加してUbuntuをインストールした”で、Ubuntu 16.04 をネイティブにインストールして、CUDAもインストールすることができたので、GPUを使用してCIFAR-10をトレーニングしてみよう。

ニューラルネットワークの推 論のハードウェア化1(概要編)
ニューラルネットワークの推論のハードウェア化をやってみようと思う。

「ゼロから作る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 だ。
「ゼロから作るDeep Learning」の2層ニューラルネットワークのハードウェア化2
前回は、「ゼロから作るDeep Learning」の5章 誤差逆伝播法の2層のニューラルネットワークをハードウェア化してFPGA に実装してみようということで、重みなどを量子化して、その精度を確認する方法を書いた。
今回は、そのPython コードを貼っておく。
「ゼロから作るDeep Learning」の2層ニューラルネットワークのハードウェア化3
前回は、Python コードを公開した。今回は、Vivado HLSに持っていくための重みとバイアスのC の配列を生成するPython コードを紹介する。更に、Vivado HLSのテストベンチに必要なMNISTデータセットの一部をC の配列に変換するPython コードも紹介する。最後にMNISTデータセットを画像として見るためのPython コードも紹介する。
「ゼロから作るDeep Learning」の2層ニューラルネットワークのハードウェア化4(Vivado HLS)
今回は、前回作成した重みやバイアス、MNISTデータセットの一部のヘッダファイルを使用して、Vivado HLS でMNISTの手書き数字を判定するハードウェアを作る。ただし、Softmax は実装が難しいし、最大値を取れば数字は推定できるので、実装していない。

MNISTデータセットの一 部をC の配列に変換するPython コードの更新
”「ゼロから作るDeep Learning」の2層ニューラルネットワークのハードウェア化3”に貼った、「Vivado HLSのテストベンチに必要なMNISTデータセットの一部をC の配列に変換するPython コード」を更新した。
10000個のMNISTのテストデータの任意の位置の100個を抽出できるように変更したの で、貼っておく。

「ゼロから作るDeep Learning」の2層ニューラルネットワークのハードウェア化5(推論の検証)
前回は、Vivado HLSを使用して、MNISTデータセットで、手書き数字を認識する2層のニューラルネットワークの推論のハードウェア化を行った。今回は、前回、ハードウェア化した ニューラルネットワークは 8 の推論をミスってしまった。MNIST データの 0 個目から100 個のデータを使用して検証したので、もう少し、違ったデータで検証してみよう。
「ゼロから作るDeep Learning」の2層ニューラルネットワークのハードウェア化6(指示子を入れる)
前回は、FPGAに実装しようとしているMNISTの推論ハードウェアが本当にうまく行ってい るのか?を確かめた。300個の手書き数字を認識した結果、精度は97.3 % であることが分かった。しかし、人間が判別しやすい手書き文字が必ずしもMNISTの推論ハードウェアに判別しやすいわけではないということが分かった。
今回は、実際にIP として使用できるようにVivado HLS に指示子を入れてみよう。
「ゼロから作るDeep Learning」の2層ニューラルネットワークのハードウェア化7(指示子を入れる2)
前回は、指示子を入れて、入力ポートと出力ポートを1個ずつバラバラにしてみた。今回は、実際 に使えるように指示子を入れてみよう。
インターフェースを決定しよう。入力は、AXI4 Master かAXI4-Stream だろう?AXI4 Master をやってみたが、入力ポートのビット幅が8ビットなので、32ビット幅のAXI4 バスに4個の入力データが入力されてきた。やはり、32ビット幅で1ピクセルデータとしたいということもあり、AXI4-Stream で行くことにした。
出力ポートは、最大値をハードウェアで判定して、答えの数字をバイナリで出力しても良いのだ が、10個の値をAXI4-Lite でARM プロセッサがRead して、最大値を判定することにしようと思う。そうすれば、ソフトウェアでSoftmax を取ることもできる。
「ゼロから作るDeep Learning」の2層ニューラルネットワークのハードウェア化8(浮動小数点数)
前回は、使いそうなインターフェース指示子を入れてみた。入力はAXI4-Stream で出力は、AXI4-Lite だった。今回は、内部の処理を浮動小数点数で処理することで、どのくらいリソースを消費するのか確かめてみよう。

「ゼロから作るDeep Learning」の畳み込みニューラルネットワークのハードウェア化1
「ゼロから作るDeep Learning」の7章 畳み込みニューラルネットワークをハードウェア化してFPGA に実装してみることにした。
「ゼロから作るDeep Learning」の畳み込みニューラルネットワークのハードウェア化2
前回は、「ゼロから作るDeep Learning」の7章 畳み込みニューラルネットワークの2層のニューラルネットワークをハードウェア化してFPGA に実装してみようということで、重みなどを量子化して、その精度を確認する方法を書いた。
今回は、そのPython コードを貼っておく。
「ゼロから作るDeep Learning」の畳み込みニューラルネットワークのハードウェア化3
前回は、Python コードを公開した。今回は、Vivado HLSに持っていくための重みとバイアスのC の配列を生成するPython コードを紹介する。畳み込み層の重みとバイアス、全結合層の重みとバイアスをC の配列として出力するPython コードだ。ここでは、浮動小数点数の配列と固定小数点数の配列の2つの配列を出力する。浮動小数点数の配列はテストベンチで使用し、固定小数点数の配列を使用した演算との 比較に使用される。固定小数点数の配列は、Vivado HLSによるハードウェア化時にも定数として使用される。
「ゼロから作るDeep Learning」の畳み込みニューラルネットワークのハードウェア化4(Vivado HLS1)
前回は、重みやバイアスのパラメータをC の配列に出力した。今回は、畳み込みニューラルネットワークのC ソースコードを作成してVivado HLSでハードウェア化してみよう。
「ゼロから作るDeep Learning」の畳み込みニューラルネットワークのハードウェア化5(再度学習)
前回、畳み込み層のカーネルが30個の畳み込みニューラルネットワークをVivado HLS で合成を行ったところ、BRAM_18K がオーバーフローしてしまった。今回は、畳み込み層のカーネルを10個にして畳み込みニューラルネットワークを学習させてみよう。
「ゼロから作るDeep Learning」の畳み込みニューラルネットワークのハードウェア化6(再度Vivado HLS )
前回は、畳み込み層のカーネルを10個にして畳み込みニューラルネットワークを学習させたとこ ろ、固定小数点数用に量子化した精度も 98.69 % だった。
今回は、畳み込み層のカーネルを10個にしたときの重みやバイアスを使用してVivado HLSで畳み込みニューラルネットワークを実装してみよう。
「ゼロから作るDeep Learning」の畳み込みニューラルネットワークのハードウェア化7(C/RTL協調シミュレーション)
前回は、畳み込みニューラルネットワークをVivado HLS でハードウェア化することができた。今回は、HDLコードを見たり、C/RTL協調シミュレーションをしてみてから、IP化を行ってみよう。ただし、デフォルトのインター フェースのままでは、IP にしたときに使いにくいので、実際に使用する際にはAXI バスにする。
「ゼロから作るDeep Learning」の畳み込みニューラルネットワークのハードウェア化8(性能向上を図る)
前回は、C/RTL協調シミュレーションを行って、波形を観察し、IP 化を行った。今回は、実際に使用するインターフェースのAXI4-Stream 入力、AXI4-Lite 出力にして、少しチューニングをしてみよう。

MNISTの畳み込みニュー ラルネットワークで自分の手書き数字を認識する1
”「ゼロから作るDeep Learning」の畳み込みニューラルネットワークのハードウェア化8(性能向上を図る)”までで、「ゼロから作るDeep Learning」の畳み込みニューラルネットワークのハードウェア化は完了した。しかし、手書き数字を認識するとは言ってもMNISTの手書き数字を認識する精度が 99 % と言っても自分の手書き数字を認識できたわけではない。ということで、自分で手描きの数字を書いて認識させてみることにした。
MNISTの畳み込みニュー ラルネットワークで自分の手書き数字を認識する2
前回はお絵描きソフトのPaint.net でブラシ幅 2 のペイントブラシ・ツールを使用して書いた手書き数字を認識してみたが、認識精度はいまいちだった。今回は、GIMP2 で幅 2 ピクセルの鉛筆ツールを使用して書いた手書き数字を認識させてみようと思う。
MNISTの畳み込みニュー ラルネットワークで自分の手書き数字を認識する3(カメラ画像)
前回はGIMP2 で幅 2 ピクセルの鉛筆ツールを使用して書いた手書き数字を認識させてみた。今回は、手書き数字をカメラで撮影した画像を切り出して認識させてみよう。

手書き数字認識用畳み込み ニューラルネットワーク回路の製作1(概要)
手書き数字認識用畳み込みニューラルネットワークができたので、カメラで撮影した画像の中の手 書き数字を認識してみようと思う。
使用するボードはPYNQボードとする。以前に、PYNQボードでFASTX コーナー検出IP を使用したプロジェクトがあるので、それをベースとする。
手書き数字認識用畳み込み ニューラルネットワーク回路の製作2(手書き数字認識用四角枠表示回路)
前回は、カメラで撮影した画像から手書き数字を指定し、手書き数字認識用畳み込みニューラル ネットワークを使用して認識する回路の概要を解説した。今回は、そのパーツとなる手書き数字認識用四角枠表示回路をVivado HLS を使用して作ってみよう。
手書き数字認識用畳み込み ニューラルネットワーク回路の製作3(畳み込みNN)
前回は、手書き数字認識用四角枠表示回路が完成した。これで画像中に認識する四角枠を表示する ことができた。この四角枠の中に手書き数字を入れれば認識することができる。今回は、四角枠の中の手書き数字を認識する畳み込みニューラルネットワークを作成 しよう。
手書き数字認識用畳み込み ニューラルネットワーク回路の製作4(Vivadoプロジェクト)
前回は、カメラのフレームバッファから直接DMA で画像データを持ってきて手書き数字を認識する畳み込みニューラルネットワークで手書き数字を認識するIP を作成した。
今回は、手書き数字認識用四角枠表示回路(IP)と、手書き数字を認識する畳み込みニューラルネットワークIP を使用してカメラで撮影した画像の内の四角枠の領域の手書き数字を認識するPYNQボード用のVivado 2017.2プロジェクトを作成する。
手書き数字認識用畳み込み ニューラルネットワーク回路の製作5(SDK)
前回は、手書き数字認識用四角枠表示回路(IP)と、手書き数字を認識する畳み込みニューラル ネットワークIP を使用してカメラで撮影した画像の内の四角枠の領域の手書き数字を認識するPYNQボード用のVivado 2017.2プロジェクトを作成した。今回は、SDKを使用してカメラ画像を表示してみよう。
手書き数字認識用畳み込み ニューラルネットワーク回路の製作6(PYNQボードで動作確認)
前回は、カメラで撮影した画像の内の四角枠の領域の手書き数字を認識するPYNQボード用の Vivado 2017.2プロジェクトで、SDKを使用してカメラ画像を表示した。今回は、mnist_conv_nn_test.c を作成して、手書き数字を認識した。
手書き数字認識用畳み込み ニューラルネットワーク回路の製作7(ハードとソフトの比較)
前回は、mnist_conv_nn_test.c を作成して、手書き数字を認識してみたところ、今のところ 100 % の精度で手書き数字を認識することができた。今回は、ハードウェアのMNISTの手書き数字を認識する時間とソフトウェアでMNISTの手書き数字を認識する時間を比較し てみようと思う。
手書き数字認識用畳み込みニューラルネットワーク回路の製作8(Linuxでの動作1)
前回はSDKを使用してベアメタル・アプリケーションでハードウェアでのMNIST手書き数字 認識とソフトウェアでのMNIST手書き数字認識の実行時間を比較した。今回は、それをLinuxのアプリケーションソフトを作成してやってみようと思う。ま ずは、カメラ画像の表示を目指す。
手書き数字認識用畳み込みニューラルネットワーク回路の製作9(Linuxでの動作2)
前回はPYNQボードのDebian 上でカメラ画像を表示するアプリケーションソフトを作成して、カメラ画像を表示した。今回は、PYNQボードのDebian 上でピンクの四角枠を表示して、その中の手書き数字を認識した。

白線追従走行用畳み込み ニューラルネットワークの製作1(概要)
MNIST手書き数字認識用ニューラルネットワークが完成したので、今度は本命のミニ・ロボッ トカーを白線間を走らせるための白線追従走行用畳み込みニューラルネットワーク(白線追従走行用CNN)を製作しよう。
白線追従走行用畳み込み ニューラルネットワークの製作2(画像縮小、切り出し)
前回から間が空いてしまったが、前回集めた直線の白線画像をデータセットにする第1段階とし て、画像縮小と切り出しを行うソフトウェアを作成してみよう。
これからの白線追従のためのニューラルネット学習のためのデータ・セット作成手順を書いておく。
MNIST手書き数字のデー タフォーマット
MNIST手書き数字のデータフォーマットを解析してみた。MNIST手書き数字のデータ フォーマットに、今回、白線追従走行用のデータフォーマットを合わせた方が都合が良いのでやってみた。
白線追従走行用畳み込み ニューラルネットワークの製作3(トレーニング、ラベル・ファイルの作成)
前回は、800 x 600 ピクセルの元画像を 60 x 45 に縮小してから、白黒変換し、56 x 10 ピクセルの白線の画像を切り出した。今回は、本格的に56 x 10 ピクセルの白線の画像を切り出すとともに、MNISTデータセットと同じフォーマットでトレーニング・ファイルとラベル・ファイルを生成しよう。
白線追従走行用畳み込み ニューラルネットワークの製作4(トレーニング・ファイルのチェック)
前回は、straight_dataset_bmp.cpp を作成して、直進学習用の白線の画像のMNISTフォーマットのトレーニング・ファイルとラベル・ファイルを作成した。今回は、トレーニング・ファイルに本当 に画像が格納されているかどうか?をチェックする。
白線追従走行用畳み込み ニューラルネットワークの製作5(テストデータの作成)
前回は、トレーニング・ファイルをチェックして、画像が取り出せることが分かった。今回は、テ ストデータを作成してみよう。
白線追従走行用畳み込み ニューラルネットワークの製作6(学習1)
前回はテストデータを測定しファイルにまとめた。今回はトレーニング・ファイルとテスト・ファ イルがそろったので、Pythonコードを使用したのCNNの学習を行う。
白線追従走行用畳み込み ニューラルネットワークの製作7(学習2)
前回は、白線追従走行の直線走行用のトレーニング・データとテスト・データを用意し、それらの データセットを使用するためのPython コードのstraight_dataset.py を用意した。今回は、浮動小数点数を使用して畳み込みニューラルネットワーク(CNN)をトレーニングするためにPython コードを修正する。
修正後、学習させてみた結果の精度は約 71.5 % だった。

ソニーのNeural Network Console をやってみた1
「Neural Network Console」という学習・評価だけでなく、ニューラルネットワークの設計までも可能なディープラーニング・ツールをソニーが無償提供したので、やってみることにした。
ソニーのNeural Network Console をやってみた2
前回は、ソニーのNeural Network Console をインストールして、サンプルプロジェクトをやってみた。今回は更にサンプルプロジェクトをやってみることした。

白線追従走行用畳み込み ニューラルネットワークの製作8(再度トレーニング、ラベル・ファイルの作成)
”白線追従走行用畳み込みニューラルネットワークの製作7(学習2)”で、精度が 71 % だったので、もう一度、白線追従直進走行用の画像データをもう一度取得して、再度トレーニング・ファイルとラベル・ファイルを作成することにした。
画像データの取得条件を記録した。
白線追従走行用畳み込み ニューラルネットワークの製作9(再度、学習)
前回、白線追従走行の直進走行用の画像データを取り直して、トレーニング・ファイルとラベル・ ファイルを作成した。そのトレーニング・ファイルとラベル・ファイルを使用して、学習してみよう。
再度学習させても精度は70%程度だった。
白線追従走行用畳み込み ニューラルネットワークの製作10(画像を増やす)
前回、精度が上がらなかったので、画像を増やしてトレーニングしてみようということになった。 今回はimagemagic を使って画像を増やしてみよう。
これで、33枚が 363 枚に増えた。これが 25 倍に増えるので、最終的には、 363 x 25 = 9075 枚になる。
白線追従走行用畳み込み ニューラルネットワークの製作12(テスト用画像ファイルとラベル・ファイルの作成)
前回は、画像ファイルを増やして、トレーニング用画像ファイルとラベル・ファイルの作成を行っ た。今回は、テスト用の画像を増やして、MNISTデータ形式のテスト用画像ファイルとテスト用ラベル・ファイルの作成を行った。
白線追従走行用畳み込み ニューラルネットワークの製作13(9075枚のトレーニング用画像データで学習)
前回で、4125 個のテスト用画像データを作ることができた。9075 個のトレーニング用画像データを使用して、今回は学習をしてみようと思う。
畳み込みフィルタ数による精度の違いをグラフにした。その結果フィルタ数2で精度が約 94.8 % になった。
白線追従走行用畳み込み ニューラルネットワークの製作14(固定小数点用に量子化)
前回は、9075 個のトレーニング用画像データと4125 個のテスト用画像データを使用して学習を行った。その結果、CONV数が 2 の畳み込みニューラルネットワークで、93.1 % の精度を得ることができた。今回は、その畳み込みニューラルネットワークを固定小数点用に量子化し、Vivado HLS に使用する重みやバイアスのヘッダファイルを生成しよう。
白線追従走行用畳み込み ニューラルネットワークの製作15(重みとバイアスのCヘッダファイル)
前回は、畳み込みニューラルネットワークを固定小数点用に量子化し、Vivado HLS に使用する重みやバイアスのヘッダファイルを生成した。今回は、その結果生成できた重みとバイアスのCヘッダファイルを貼っておく。
白線追従走行用畳み込み ニューラルネットワークの製作16(白線追従走行用の画像データをCの配列に出力)
前回は、重みとバイアスをC のヘッダファイルに変換したものを貼った。今回は、Pythonで白線追従走行用の画像データをC のヘッダファイルに変換する。これは、Vivado HLS のテストベンチに組み込まれて、シミュレーション時に使用する予定だ。
白線追従走行用畳み込み ニューラルネットワークの製作17(白線追従走行用画像データから一部を抜き出して画像にする)
前回は、白線追従走行用の画像データをC のヘッダファイルに変換するPython コードを作成した。今回は、白線追従走行用の画像データを確認するために、白線追従走行用画像データから一部を抜き出して画像にするPython コードを作成した。
白線追従走行用畳み込み ニューラルネットワークの製作18(Vivado HLSでCシミュレーション)
前回は、白線追従走行用の画像データを確認するために、白線追従走行用画像データから一部を抜 き出して画像にするPython コードを作成した。今回は、いよいよVivado HLS 用のファイルがそろったので、Vivado HLS 2016.4 でプロジェクトを作成し、C シミュレーションを行う。
白線追従走行用畳み込み ニューラルネットワークの製作19(Cコードの合成、IP化)
前回は、Vivado HLS 用のファイルがそろったので、Vivado HLS 2016.4 でプロジェクトを作成し、C シミュレーションを行って精度を確認した。今回は、Cコードの合成を行って、レイテンシやリソース使用量を確認する。
白線追従走行用畳み込み ニューラルネットワークの製作20(CNN IPの戦略を考える)
前回で、直進のみだけど白線追従走行用畳み込みニューラルネットワークの推論用Vivado HLSのプロジェクトは完成した。ただしまだ畳み込みニューラルネットワークを固定小数点数で作って性能を確認しただけで、どのようにFPGA上の回路にする かの検討はまだしていない。今回は、どのようにFPGA上の回路にするかの検討を行っていこう。

Vivado HLS で画像のサイズを縮小して白黒変換(resize_gray)
”1/10 まで縮小して白黒変換”ブロックをVivado HLS で作ることにする。ただし、図では”1/10 まで縮小して白黒変換”ブロックはAXI4 Master の予定だったが、性能が出せるようにDMA Read は分けようと思う。”1/10 まで縮小して白黒変換”ブロックはAXI4 Stream の入力ポートと出力ポートを持つように実装しよう。Vivado HLS の HLS ビデオライブラリの Resize() を使用して縮小することにしようと思う。
実際には1/13に縮小した。
画像をリサイズするために DMA Read IPをVivado HLSで製作した1(dmar4resize_gray)
”Vivado HLS で画像のサイズを縮小して白黒変換(resize_gray)”でAXI4 Stream 入力の画像をリサイズして白黒変換するIP (resize_gray))を作成した。今回は、フレームバッファからDMA Read して AXI4 Stream 出力して resize_gray にAXI4 Stream 入力するIP (dmar4resize_gray)を作成する。
画像をリサイズするために DMA Read IPをVivado HLSで製作した2(dmar4resize_gray)
前回は、フレームバッファからDMA Read して AXI4 Stream 出力して resize_gray にAXI4 Stream 入力するIP (dmar4resize_gray)のC シミュレーションを行った。Ubuntu 16.04 上のVivado HLS 2016.4 はC シミュレーションがうまく行かなかったが、Windows 10 Pro 上のVivado HLS 2016.4 はC シミュレーションがうまく行った。
今回は、C コードの合成、C/RTL協調シミュレーション、Export RTL を行う。
白線追従走行用畳み込み ニューラルネットワークのチューニング
”白線追従走行用畳み込みニューラルネットワークの製作18(Vivado HLSでCシミュレーション)”
”白線追従走行用畳み込みニューラルネットワークの製作19(Cコードの合成、IP化)”
で書いた straight_conv_nn2 プロジェクトの straight_conv_nn2.cpp をチューニングしてみた。C ソースコードはそのままに、指示子を挿入して、速度が出るようにやってみたが、結構いい加減に指示子を挿入している。
Vivado HLS で実装した畳み込みニューラルネットワークの指示子による性能差
Vivado HLS で実装した白線追従用の畳み込みニューラルネットワークで指示子を入れていないときと入れたときの性能差を比べてみよう。
Vivado HLS で実装した畳み込みニューラルネットワークの指示子による性能差2
前回は、指示子なしの場合の性能とリソース使用量と目いっぱい指示子を入れたときの差を検証し た。今回は更に性能が向上したのでご紹介する。
Vivado HLS で画像のサイズを縮小して白黒変換2(resize_gray)
”Vivado HLS で画像のサイズを縮小して白黒変換(resize_gray)”を少し修正した。resize_grey はOpenCV やHLS ビデオライブラリを使用して画像をリサイズして白黒変換するのだが、その色のビット・フィールドのアサインはBGR になっている。現在の自作カメラ・インターフェイス IP などのハードウェアの色ビットの割り当てはRGB になっているので、色のビット・フィールドを入れ替える必要がある。そのため、resize_gray の色ビット・フィールドをRGB に入れ替えようと思う。
AXI4 Stream版白線追従走行用畳み込みニューラルネットワークIPその1(C シミュレーション)
”白線追従走行用畳み込みニューラルネットワークの製作18(Vivado HLSでCシミュレーション)”
”白線追従走行用畳み込みニューラルネットワークの製作19(Cコードの合成、IP化)”
で作成した白線追従走行用畳み込みニューラルネットワークをAXI4 Streamで入力するように変更した。これは、”Vivado HLS で画像のサイズを縮小して白黒変換2(resize_gray)”のAXI4 Stream 入力を受けて、白線追従走行用畳み込みニューラルネットワークにそのAXI4 Stream データを入力して処理する。
AXI4 Stream版白線追従走行用畳み込みニューラルネットワークIPその2(C シミュレーション2)
”AXI4 Stream版白線追従走行用畳み込みニューラルネットワークIPその1(C シミュレーション)”は、、”Vivado HLS で画像のサイズを縮小して白黒変換2(resize_gray)”のAXI4 Stream 入力を受けてとは書いたが、BGR になってしまっていて、RGB では無かったので書き直した。また、畳み込みニューラルネットワークの最後の全結合層の出力をIP の出力として返していたが、分かりにくいので、進行方向の番号を返すように変更した。ちなみに 0 - 左旋回、1 - 直進、2 - 右旋回だ。
CNNのVivado HLS実装のstraight_conv_nn2 を再度C シミュレーション
”AXI4 Stream版白線追従走行用畳み込みニューラルネットワークIPその2(C シミュレーション2)”で 、”白線追従走行用畳み込みニューラルネットワークの製作18(Vivado HLSでCシミュレーション)”のstraight_conv_nn2 の精度が良かったのは画像が良かったからという結論が出たので、精度の悪そうな画像でもう一度、straight_conv_nn2 のC シミュレーションを行った。
CNNのVivado HLS実装のstraight_conv_nn2 の演算精度を変更する
前回は、straight_conv_nn2 の精度が良かったのは画像が良かったからという結論が出たので、精度の悪そうな画像でもう一度、straight_conv_nn2 のC シミュレーションを行った。そうすると、ハードウェアの精度は56.7 % だった。これでは精度が悪すぎるので、演算の精度、つまりビット幅を見直すことにした。演算のビット幅を変えながら誤差を見ていこう。
AXI4 Stream版白線追従走行用畳み込みニューラルネットワークIPその3(C シミュレーション、合成)
前回は、AXI4 Stream のビットアサインがBGR になってしまっていて、RGB では無かったので書き直した。また、畳み込みニューラルネットワークの最後の全結合層の出力をIP の出力として返していたが、分かりにくいので、進行方向の番号を返すように変更した。ちなみに 0 - 左旋回、1 - 直進、2 - 右旋回ということだったが、右旋回の出力が15個の内の5個間違っていた。それで、”CNNのVivado HLS実装のstraight_conv_nn2 の演算精度を変更する”で演算のビット幅を変更した。今回はどの程度右旋回のエラーが直っているか?を見てみよう。
dmar4resize_gray, resize_gray, straight_conv_nn2_axis2 をVivado HLS 2017.2 で IP化
今まで作ってきたIP のdmar4resize_gray, resize_gray, straight_conv_nn2_axis2 は今まで、Vivado HLS 2016.4 を使用してきたが、Vivado HLS 2017.2 で IP化しようと思う。やはり、ZYBOのシステムはVivado 2017.2 で構築するので、その方が良いだろうと思う。

白線追従走行用畳み込み ニューラルネットワーク・システムの製作1
”dmar4resize_gray, resize_gray, straight_conv_nn2_axis2 をVivado HLS 2017.2 で IP化”でIP が揃ったので、白線追従走行用畳み込みニューラルネットワーク・システムの製作を行うことにした。
これは、白線追従走行用畳み込みニューラルネットワークを搭載して、カメラ画像から進む方向 (左旋回、直進、右旋回)を決定し、モーターを駆動して、ミニ・ロボットカーに白線間を走行させるシステムである。
白線追従走行用畳み込み ニューラルネットワーク・システムの製作2
前回は、”dmar4resize_gray, resize_gray, straight_conv_nn2_axis2 をVivado HLS 2017.2 で IP化”でIP が揃ったので、白線追従走行用畳み込みニューラルネットワーク・システムの製作を行ったが、straight_conv_nn2_axis2 でタイミングエラーが発生してしまった。今回は、straight_conv_nn2_axis2 のタイミング制約を厳しくして、Vivado HLS 2017.2 で再合成する。
白線追従走行用畳み込み ニューラルネットワーク・システムの製作3(SDK)
前回は白線追従走行用畳み込みニューラルネットワーク・システムのハードウェアが完成した。今 回は、SDKを使用して、カメラ画像をディスプレイに表示するアプリケーションソフトを起動して、ハードウェアがとりあえず正しく動作するか?を確かめてみよ う。
白線追従走行用畳み込み ニューラルネットワーク・システムの製作4(BOOT.binとデバイスツリー)
前回は、SDKでアプリケーションソフトを作成してカメラ画像が表示できることが確認 できた。今回は、SDK でFSBL を作成してから、BOOT.bin を作成した。そして、デバイスツリーのソースをUbuntu 上でコンパイルして devicetree.dtb を作成し、ZYBO のMicro SD カードに書き込んで、/sys/devices/amba.0 以下のディレクトリを確認した。
白線追従走行用畳み込み ニューラルネットワーク・システムの製作5(実機で確認)
前回は、BOOT.bin と devicetree.dtb を作成して、ZYBO でUbuntu を立ち上げ、デバイスが見えるかどうか?を確かめた。今回は、SDKを使用したベアメタル・アプリケーションで、実際に白線追従走行用畳み込みニューラルネットワークが動 作するかどうか?を確かめる。
白線追従走行用畳み込み ニューラルネットワーク・システムの製作6(実機で確認2)
前回は、白線追従走行用畳み込みニューラルネットワークが動作しているかどうか確認す るために各出力の値を出力するように、Vivado HLS プロジェクトの straight_conv_nn2_axis3 を変更した。今回は、Vivado HLS プロジェクトの straight_conv_nn2_axis3 を変更したのだが、関数名は straight_conv_nn2_axis2 にしてあるので、今までのstraight_conv_nn2_axis2 IP と入れ替えることができるので、入れ替えて、ZYBO_0_172_8 フォルダのVivado プロジェクトでビットストリームの生成を行って、実機で試してみよう。
白線追従走行用畳み込み ニューラルネットワーク・システムの製作7(白線間を走行)
前回は、SDKで進む方向を表示するアプリケーションソフトを製作して、問題がないことを確か めた。今回は、ZYBO のUbuntu 14.04 上でアプリケーションソフトを作り、白線間を走行させる。

「RTLを語る会(14) ~FPGAの現実~」で発表してきました
「RTLを語る会(14) ~FPGAの現実~」で「「ゼロから作るDeep Learning」の畳み込みニューラルネットワークのハードウェア化」という題で1時間発表してきました。

ソニーのNeural Network Console をやってみた3
zip ファイルを展開してからNeural Network Console を起動した。

カー ブ、直線用白線間走行用畳み込みニューラルネットワーク1(データ)
”白線追従走行用畳み込みニューラルネットワーク・システムの製作7(白線間を走行)”で、ミ ニ・ロボットカーが直線の白線を走行することができた。
次はカーブを曲がれるようにしたい。そこで、曲がってい角度が 23 度のカーブと 48 度のカーブを用意して、曲がれるかどうかを試してみた。(注:カーブを曲がる学習はまだしていません。直線を走る学習のみです)
23 度のカーブは曲がれる時もあるようだ。
カーブ、直線用白線間走行用 畳み込みニューラルネットワーク2(本格的なデータ収集)
前回は、48 度のカーブと23 度のカーブの 2 種類を作ってデータを収集したが、データの取得がいい加減だったので、データを取り直した。
カーブ、直線用白線間走行用 畳み込みニューラルネットワーク3(画像の加工)
前回で取得できた画像を使用して画像を縮小して切り出し、様子を見てみようと思う。本格的に MNIST 形式のデータを作成するのは画像を増やしてからとする。
カーブ、直線用白線間走行用 畳み込みニューラルネットワーク4(学習画像を増やす)
前回は、白黒変換して 0.075 倍 ( 1/13.33333... ) にした後で、56 ピクセル X 10 行の画像を 25 枚切り出してみた。それでも、( 41 + 18 + 18 ) x 25 = 1925 枚なので、元画像を加工して増やしてみようと思う。
カーブ、直線用白線間走行用 畳み込みニューラルネットワーク5(トレーニング用データの生成)
前回は、 41 + 18 + 18 = 71 枚の学習画像をコントラストを変えたり、ぼかしたり、ガンマ値を変えたり、ノイズを加えたりして、1,386 枚に増やした。今回はその学習画像をMNISTのデータ形式に変換する。
カーブ、直線用白線間走行用 畳み込みニューラルネットワーク6(テスト用画像を増やす)
前回は、学習画像をMNISTのデータ形式に変換した。テスト用の画像を”カーブ、直線用白線 間走行用畳み込みニューラルネットワーク2(本格的なデータ収集)”で収集した。今回は、それの画像を増やすことにした。
”カーブ、直線用白線間走行用畳み込みニューラルネットワーク4(学習画像を増やす)”と同様に imagemagic を使ってバッチ・ファイルを起動して、画像を増やしていて、17倍に増やしている。元の画像が1組あるので、直進が 35 X 18 = 630 枚になる。右旋回と左旋回は 12 X 18 = 216 枚になる予定だ。合計のテスト用画像は 1062 枚になるはずだ。
カーブ、直線用白線間走行用 畳み込みニューラルネットワーク7(テスト用データの作成)
前回は、学習画像をMNISTのデータ形式に変換した。テスト用の画像を”カーブ、直線用白線 間走行用畳み込みニューラルネットワーク2(本格的なデータ収集)”で収集した画像を 1062 枚に増やした。今回は、それを 白黒変換し、白線の部分だけを 56 ピクセル X 10 行の画像を一枚の画像から 25 個切り出して、MNISTデータ形式のテスト用画像ファイルとテスト用ラベル・ファイルを作成する。
カーブ、直線用白線間走行用 畳み込みニューラルネットワーク8(学習)
前回は、”カーブ、直線用白線間走行用畳み込みニューラルネットワーク2(本格的なデータ収 集)”で収集したテスト用の画像を 1062 枚に増やした。そして、それを 白黒変換し、白線の部分だけを 56 ピクセル X 10 行の画像を一枚の画像から 25 個切り出して、MNISTデータ形式のテスト用画像ファイルとテスト用ラベル・ファイルを作成した。今回はこれで、トレーニング用とテスト用のデータセットがそろったの で、Jupyter Notebook を使用して学習してみよう。
テストデータの精度は 95.4 % 程度だった。
カーブ、直線用白線間走行用 畳み込みニューラルネットワーク9(量子化)
前回は、カーブと直線の白線間を走行するためのデータセットで畳み込み層 - ReLU - プーリング層 - 全結合層 - ReLU - 全結合層 - SoftMax の畳み込みニューラルネットワークを学習した。今回は、学習した重みとバイアスを量子化してどの程度の精度が出るかを確かめてみよう。
カーブ、直線用白線間走行用 畳み込みニューラルネットワーク10(重みとバイアスをC のヘッダファイルに変換)
前回は、カーブと直線の白線間を走行するためのデータセットで畳み込みニューラルネットワーク を学習したときの重みとバイアスを量子化してどのくらいの精度が出るのか?を検証した。今回は、その重みとバイアスを C のヘッダファイルに変換して、Vivado HLS で使用できるようにしてみよう。
カーブ、直線用白線間走行用 畳み込みニューラルネットワーク11(画像データをCのヘッダファイルに変換)
前回は、学習した重みとバイアスを C のヘッダファイルに変換した。その配列は、float と固定小数点数の2つの配列がある。今回は、画像データの一部をCのヘッダファイルに変換する。
カーブ、直線用白線間走行用 畳み込みニューラルネットワーク11(Vivado HLS でCNN を実装)
前回は、カーブと直線の白線間を走行するためのデータセットで畳み込みニューラルネットワーク を学習したときの重みとバイアスを C のヘッダファイルに変換して、Vivado HLS で使用できるようにした。これでVivado HLS でカーブと直線の白線間走行用畳み込みニューラルネットワークを実装する準備が整ったので、今回は、Vivado HLS 2017.3 で畳み込みニューラルネットワークを実装しよう。
カーブ、直線用白線間走行用 畳み込みニューラルネットワーク12(直線走行用の重みとバイアスでカーブのテストデータを検証)
前回は、Vivado HLS 2017.3 で畳み込みニューラルネットワークを実装した。カーブと直線のテストデータでの精度は、ハードウェアで、約 97.7 % 、96.3 % 、95.3 % だった。今回は、この精度が、直線のみの重みとバイアスでどの程度になるか?を検証してみよう。
カーブ、直線用白線間走行用 畳み込みニューラルネットワーク13(AXI4 Stream版CNN IP 1)
AXI4 Stream版白線追従走行用畳み込みニューラルネットワークIP と入れ替えるためにカーブと直線走行用のAXI4 Stream 版畳み込みニューラルネットワーク IP を作成しよう。
カーブ、直線用白線間走行用 畳み込みニューラルネットワーク14(AXI4 Stream版CNN IP 2)
前回は、カーブと直線走行用のAXI4 Stream 版畳み込みニューラルネットワーク IP を作成するために、curve_conv_nn2_axis3 プロジェクトを作成し、C シミュレーションを行った。今回は、C コードの合成を行い、Export RTL で IP にする。
カーブ、直線用白線間走行用 畳み込みニューラルネットワーク15(Vivadoプロジェクト)
前回で、カーブと直線での出力を学習した畳み込みニューラルネットワークをVivado HLS 2017.3 で IP にすることができた。今回はその curve_conv_nn2_axis3 IP を使用し、直線用のVivado 2017.3 のプロジェクトを修正して、カーブと直線対応のミニ・ロボットカーの走行システムを作成してみよう。
カーブ、直線用白線間走行用 畳み込みニューラルネットワーク16(SDK)
前回は、 curve_conv_nn2_axis3 IP を使用し、直線用のVivado 2017.3 のプロジェクトを修正して、カーブと直線対応のミニ・ロボットカーの走行システムをVivado 2017.3 で作成した。今回は、ハードウェアをエクスポートして、SDKを立ち上げ、アプリケーションソフトを作成して動作を確認してみよう。
カーブ、直線用白線間走行用 畳み込みニューラルネットワーク17(BOOT.bin と devicetree.dtb の生成)
前回は、ハードウェアをエクスポートして、SDKを立ち上げ、アプリケーションソフトを作成し て動作を確認した。今回は、SDK でBOOT.bin を作成し、zynq-zybo.dts から devicetree.dtb を作成してみよう。
カーブ、直線用白線間走行用 畳み込みニューラルネットワーク18(ミニ・ロボットカーでの走行テスト)
前回は、SDK でBOOT.bin を作成し、zynq-zybo.dts から devicetree.dtb を作成して、Ubuntu にマウントした、MicroSDカードの第1パーティションにSFTPで書き込んだ。今回は、カーブと直線の白線間走行用のアプリケーションソフト (wl_tracing_cnn.cpp)を作成して、ミニ・ロボットカーで実際に白線間を走行させてみる。
カーブ走行動画あり。

白線間走行畳み込みニューラ ルネットワーク のアーキテクチャの図を出力した
@yu4u さんの”畳み込みニューラルネットワークをKeras風に定義するとアーキテクチャを図示してくれるツールを作った”を使わせて頂いて、自分の白線間走行畳み込みニューラ ルネットワーク のアーキテクチャの図を出力する。

これから作る畳み込みニュー ラルネットワークについての目標
今まで、1クロックごとに1判定出力できる畳み込みニューラルネットワークを Vivado HLS で作ろうと思った。これは結局挫折したが、なるべくレイテンシが短くなるように作っている。
これから作る畳み込みニュー ラルネットワークについての目標2
AXI4-Stream 対応のラプラシアンフィルタの様に畳み込みニューラルネットワークを作る予定だ。
畳み込み層はそのままフィルタなので、ラプラシアンフィルタなどの構造を元に作ることができる と思う。
それに各層、畳み込み層やReLU、マックス・プーリング層、全結合層などをAXI4-Stream インターフェースで接続されるIPとしてVivado のIP インテグレータで接続すればよいのではないだろうか?もし、1 個のFPGA でロジックが足りなければ、AXI4-Stream インターフェースを外に出して他のFPGA に接続すれば良いのでは?と思う。

AXI4-Stream インターフェースの畳み込み層1(C コードの合成)
”Vivado HLSでのAXI4-Stream のテンプレートを作成する2”でAXI4-Stream インターフェースのテンプレートが決定できたので、いよいよ畳み込み層を作ってみよう。畳み込み層は今まで作ってきた画像フィルタと何ら変わるところはない。
AXI4-Stream インターフェースの畳み込み層2(C シミュレーション)
前回は、2 つの実装の畳み込み層のC ソースコードを書いて、C コードの合成を行った。今回は、テストベンチを書いたので、C シミュレーションを行った。
AXI4-Stream インターフェースの畳み込み層3(C ソースコード)
前回はAXI4-Stream 版の畳み込み層のC シミュレーションを行った。今回は、そのソースコードを貼っておく。
AXI4-Stream インターフェースの畳み込み層4(C/RTL 協調シミュレーションとExport RTL)
前回は、すべてのC ソースコードとBMP 画像ファイルを貼ったので、手元でも確認できる様になったと思う。今回は、畳み込み層のC/RTL 協調シミュレーションとExport RTLを行う。
AXI4-Stream インターフェースの畳み込み層5(出力値のヘッダファイルを出力)
前回は、C/RTL 協調シミュレーションとExport RTL を行った。今回は、次の層のデータとして、畳み込み層の出力値のC のヘッダファイルを作成するようにテストベンチを変更した。

AXI4-Stream インターフェースのReLU 1(C++ ソースコード)
AXI4-Stream インターフェースの畳み込み層に続いて、AXI4-Stream インターフェースのReLU IP を作成しよう。
AXI4-Stream インターフェースのReLU 2(CシミュレーションとCコードの合成)
前回は、C++ ソースコードを貼った。今回は、Vivado HLS 2017.4 の relu プロジェクトで C シミュレーションと C コードの合成を行う。
AXI4-Stream インターフェースのReLU 3(C/RTL協調シミュレーションとExport RTL )
前回は、ReLU プロジェクトのC シミュレーションとC コードの合成を行った。今回は、ReLU プロジェクトのC/RTL 協調シミュレーションとExport RTLを行う。

AXI4-Stream インターフェースのMax Pooling 1(ソースコード)
AXI4-Stream インターフェースのReLU に続いて、AXI4-Stream インターフェースの Max Pooling を作っていこう。
AXI4-Stream インターフェースのMax Pooling 2(Cシミュレーションと合成)
前回は、AXI4-Stream インターフェースの Max Pooling のソースコードを貼った。今回はVivado HLS 2017.4 で max_pooling プロジェクトを作成して、C シミュレーションと C コードの合成を行う。
AXI4-Stream インターフェースのMax Pooling 3(C/RTL 協調シミュレーションとExport RTL)
前回は、Vivado HLS 2017.4 で max_pooling プロジェクトを作成して、C シミュレーションと C コードの合成を行った。今回は、 max_pooling プロジェクトのC/RTL 協調シミュレーションとExport RTLを行う。

AXI4-Stream インターフェースの全結合層1(C コードや指示子による性能差1)
AXI4-Stream インターフェースの Max Pooling に続いて、AXI4-Stream インターフェースの全結合層を作っていこう。
AXI4-Stream インターフェースの全結合層2(C コードや指示子による性能差2)
前回は、AXI4-Stream インターフェースの全結合層の最初のC ソースコードを合成したときの実力を見てきた。今回は、更に指示子を入れて行くと、どの様に性能が変化するかを見ていきたい。
AXI4-Stream インターフェースの全結合層3(C コードや指示子による性能差3)
前回は、ピクセルをカウントするfor ループの内部をすべて展開して 1 クロックで実行することができた。その結果として、全結合層の処理を 84 クロックで処理することができた。しかし、リソースが500 % 以上でとてもZYBO Z7-20 に入らなかった。今回は今のスキームで現実的にZYBO Z7-20 のリソースで収まる回路を考えてみよう。
AXI4-Stream インターフェースの全結合層4(C コードや指示子による性能差4)
前回は、af1_weight[][] と dot[] をBRAM にマップしたほうが良いかな?ということになったが、II = 2 クロックとなって、性能的に少し不満があったので、この辺りをチューニングしてみよう。
AXI4-Stream インターフェースの全結合層5(C シミュレーション、C/RTL 協調シミュレーション、Export RTL )
前回で、ハードウェア化する C ソースコードは確定した。今回は、テストベンチを作成して、C シミュレーション、C/RTL 協調シミュレーション、Export RTL を実行した。

AXI4-Stream インターフェースの全結合層後のReLU 1(C ソースコード)
AXI4-Stream インターフェースの全結合層後のReLU の第1回目で、今回はC ソースコードを貼っておく。
AXI4-Stream インターフェースの全結合層後のReLU 2
前回は、AXI4-Stream インターフェースの全結合層後のReLU の C ソースコードを貼った。今回は、C シミュレーション、C コードの合成、C/RTL 協調シミュレーション、Export RTL を行う。

AXI4-Stream インターフェースの全結合層2層目1(指示子による性能差)
AXI4-Stream インターフェースの 全結合層後のReLU の後に続いて、AXI4-Stream インターフェースの全結合層2層目を作っていこう。
AXI4-Stream インターフェースの全結合層2層目2(C シミュレーション、C/RTL 協調シミュレーション)
前回は、AXI4-Stream インターフェースの全結合層2層目のC コードの合成とExport RTLを行った。今回は、C シミュレーションとC/RTL 協調シミュレーションを行う。

AXI4-Stream インターフェースの最終出力層1(C ソースコード)
AXI4-Stream インターフェースの最終出力層を作っていく。この層は、全結合層2層目のAXI4-Stream 出力を受けて、最大値の出力の配列の値に1 をセットして、それ以外の配列の値は 0 にする。
AXI4-Stream インターフェースの最終出力層2(C シミュレーション、C コードの合成、C/RTL 協調シミュレーション、Export RTL )
前回は、AXI4-Stream インターフェースの最終出力層のC ソースコードを貼っておいた。今回は、C シミュレーション、C コードの合成、C/RTL 協調シミュレーション、Export RTLを行う。
AXI4-Stream インターフェースの最終出力層3(出力フォーマットの変更 )
前回は、AXI4-Stream インターフェースの最終出力層のC シミュレーション、C コードの合成、C/RTL 協調シミュレーション、Export RTLを行った。今回は、出力フォーマットを変更したので、もう一度、それらをやり直す。

AXI4-Stream インターフェースの畳み込みニューラルネットワーク1(概要説明)
いよいよ今まで作ってきたAXI4-Stream インターフェースの各層をつないで、AXI4-Stream インターフェースの畳み込みニューラルネットワークをテストしていこう。
AXI4-Stream インターフェースの畳み込みニューラルネットワーク2(C コードの合成、Export RTL)
前回は、AXI4-Stream インターフェースの各層をつないだ AXI4-Stream インターフェースの畳み込みニューラルネットワークの概要を説明した。今回は、AXI4-Stream インターフェースの畳み込みニューラルネットワークのC コードの合成と Export RTL を行った。
AXI4-Stream インターフェースの畳み込みニューラルネットワーク3(シミュレーション)
前回は、AXI4-Stream インターフェースの畳み込みニューラルネットワークのC コードの合成と Export RTL を行った。今回は、AXI4-Stream インターフェースの畳み込みニューラルネットワークの C シミュレーションと C/RTL 協調シミュレーションを行う。
AXI4-Stream インターフェースの畳み込みニューラルネットワーク4(ビット幅の変更)
前回は、AXI4-Stream インターフェースの畳み込みニューラルネットワークの C シミュレーションと C/RTL 協調シミュレーションを行った。今回は、ビット幅を変更したときの精度とリソース使用量の違いを見ていこう。
AXI4-Stream インターフェースの畳み込みニューラルネットワーク5(モードの変更)
前回は、AXI4-Stream インターフェースの畳み込みニューラルネットワークのビット幅を変更したときの変化を確認した。今回は、量子化モード、オーバーフローモードを変更した場合の精度とリソー ス使用量の違いを見ていこう。

YOLOv3 をやってみた
YOLOv3 が”YOLO: Real-Time Object Detection”の通りにやれば、簡単に出来たので、ブログに書いておく。
YOLOv2 をやってみた
”YOLOv3 をやってみた”に続いて、YOLOv2 をやってみたので、YOLOv3 との比較をしてみよう。
darknet で画像認識をやってみる1(ImageNet Classification)
今回は、darknet の Classification(画像認識)をやってみようと思う。
darknet で画像認識をやってみる2(Tiny Darknet)
前回の extraction は 27 層だったが、今回は、更に層数の少ない 22 層の Tiny Darknet をやってみることにした。

HLSストリーム・インター フェースの畳み込み層1(Cソースコード、C コードの合成、Export RTL)
”Vivado HLSでのAXI4-Stream のテンプレートを作成する3”で検証した結果によると、HLS ストリームでテンプレートを作れば、特徴マップの個数分のデータを配列として、HLS ストリームに加えられることが分かったので、AXI4-Stream インターフェースの畳み込み層をHLS ストリームで書き換えてみることにした。
HLSストリーム・インター フェースの畳み込み層2(C シミュレーション、C/RTL 協調シミュレーション)
前回は、畳み込みニューラルネットワークの畳み込み層をHLS ストリームで記述することで、特徴マップを配列にしてHLS ストリームで転送するように記述することができた。それで、C コードの合成、Export RTL を行った。今回は、畳み込み層の C シミュレーション、C/RTL 協調シミュレーションを行う。
HLSストリーム・インター フェースの畳み込み層3(Windows 10 のVivado HLS 使用)
Linux 版の Vivado HLS 2017.4 では(正確にいうと SDx 2017.4 のVivado HLS )では、HLSストレーム・インターフェース版畳み込み層のC/RTL 協調シミュレーションがエラーになってしまった。そこで、Windows 10 のVivado HLS 2017.4 (こちらも SDx がインストールしたVivado HLS)で試してみようと思う。なお、ソースコードは同一のコードを使用している。
HLSストリーム・インター フェースの畳み込み層4(検証用関数conv_layer2()を追加)
”畳み込みニューラルネットワークのコードを書く時の検証方法”で、異なる実装の検証用の関数 を用意することにしたので、早速、畳み込み層で検証用関数 conv_layer2() をテストベンチに実装してみた。

HLSストリーム・インター フェースのReLU1
HLSストリームの畳み込み層に続き、HLSストリームのReLU を実装して行こう。
HLSストリーム・インター フェースのReLU2(C ソースコード)
前回は、HLSストリーム・インターフェースでReLU を作成した。今回はその C ソースコードを貼っておく。

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

HLSストリームのマック ス・プーリング層1(C ソースコード)
HLSストリームのマックス・プーリング層をやっていこう。今回は、C ソースコードを貼っておく。
HLSストリームのマック ス・プーリング層2(Export RTLまで)
前回はマックス・プーリング層の C ソースコードを公開した。今回は、C シミュレーション、C コードの合成、C/RTL 協調シミュレーション、Export RTL を行う。

HLSストリームの全結合層 1(C ソースコード)
HLSストリームのマックス・プーリング層に続いて、HLSストリームの全結合層をやっていこ う。
今回は、C ソースコードを貼っておく。
HLSストリームの全結合層 2(Export RTLまで)
前回は、HLSストリームの全結合層のC ソースコードを貼ったので、今回は、HLSストリームの全結合層1層目のC シミュレーション、C コードの合成、C/RTL 協調シミュレーション、Export RTL を行う。

HLSストリームの最終出力 層(C ソースコード)
今回は、HLSストリームの最終出力層をやってみることにする。最終出力層は、CNN の 3 つの出力の内で、最大の値を出力した出力ポートのID を出力する。また、3 つの出力も出力する。
HLSストリームの最終出力 層(Export RTL まで)
前回は、HLSストリームの最終出力層の C ソースコードを貼った。今回は、HLSストリームの最終出力層の C シミュレーション、C コードの合成、C/RTL 協調シミュレーション、Export RTL を行う。

テンプレートで書いた全結合 層1(テンプレートのソースコード)
今まで書いてきたHLSストリームでもストリームのデータの配列は書けたのだが、1つのコード ですべての全結合層をインスタンスすることはできなかった。そこで、ツィッターで聞いたのだが、@ciniml さんがテンプレートを使ってはどうか?と提案してくれた。それに、Xilinxの BNN-PYNQ がそのように作られているということを教えてもらった。
早速、BNN-PYNQを調べると、教えてもらった通りにテンプレートを使ってありました。ここで、Vivado HLSにおけるテンプレートの使い方を勉強して自分で全結合層のテンプレート実装を書いてみた。
テンプレートで書いた全結合 層2(Export RTL まで)
前回はテンプレートで書いた全結合層のC ソースコードを貼ったので、今回はその性能を確認してみよう。

テンプレートで書いた畳み込 み層1(テンプレートのソースコード)
前回はテンプレートを使用して全結合層を書いたが、今回は畳み込み層をテンプレートを使用して 書いた。
PADDING(パディングの数)とPADDING_DATA(パディングのデータ)と STRIDEを追加した。でも検証していないので、そのような畳み込み層を使用するときにデバックしたい。現在のパディング無し、STRIDE が 1 の畳み込み層においては出力データは正しいと思う。
テンプレートで書いた畳み込 み層2(Export RTL まで)
前回はテンプレートで書いた畳み込み層のC ソースコードを貼ったので、今回はその性能を確認してみよう。

テンプレートで書いた畳み込 み層の ReLU 1(ソースコード)
今回は、畳み込み層のReLUをテンプレートを作って作成しよう。今回はソースコードを貼って おく。
テンプレートで書いた畳み込 み層の ReLU 2(Export RTL まで)
前回は、畳み込み層のReLUをテンプレートを作って作成し、そのソースコードを貼った。今回 は、C シミュレーション、C コードの合成、Export RTL を行った。C/RTL 協調シミュレーションは省いた。
テンプレートで書いた全結合 層のReLU
”テンプレートで書いた畳み込み層の ReLU 1(ソースコード)”で relu_template.h を貼ったが、それを使用して、全結合層のReLU を実行してみよう。

テンプレートで書いた畳み込 み層の入力層(ソースコード)
テンプレートで書いた畳み込み層では、汎用化するために入力のフォーマットを ap_fixed_axis にしている。このため、以前のフォーマットを ap_fixed_axis に変換する入力層が必要となった。その入力層を作っていこう。
テンプレートで書いた畳み込 み層の入力層(Export RTL まで)
前回は、テンプレートで書いた畳み込み層では、汎用化するために入力のフォーマットを ap_fixed_axis にしている。このため、以前のフォーマットを ap_fixed_axis に変換する入力層が必要となった。その入力層を作ってソースコードを貼った。今回は、C シミュレーション、C コードの合成、C/RTL 協調シミュレーション、Export RTL を行った。

テンプレートで書いたマック ス・プーリング層(ソースコード)
今回は、テンプレートで書いたマックス・プーリング層だ。今回は、ソースコードを貼っておく。
テンプレートで書いたマック ス・プーリング層2(Export RTL まで)
前回は、テンプレートで書いたマックス・プーリング層のソースコードを貼った。今回は、C シミュレーション、C コードの合成、Export RTL を行った。

テンプレートで書いた畳み込 みニューラルネットワーク1(ソースコード)
今まで作ってきたテンプレートで書いた各層をつないで、畳み込みニューラルネットワーク (CNN)を構築する。層がテンプレートで書かれているので、パラメータを入れれば簡単に?いろいろなCNN をFPGA で構成することができるはず。。。
テンプレートで書いた畳み込 みニューラルネットワーク2(C シミュレーションとC コードの合成)
前回は、テンプレートで書いた各層をつないで、畳み込みニューラルネットワーク(CNN)を構 築するためのソースコードを貼った。今回は、そのソースコードを使用して、Vivado HLSのプロジェクト all_layers_template を作成して、C シミュレーションと C コードの合成を行う。
テンプレートで書いた畳み込 みニューラルネットワーク2(C/RTL協調シミュレーションとExport RTL)
前回は、テンプレートで書いた各層をつないで、畳み込みニューラルネットワーク(CNN)を構 築した。そして、Vivado HLSのプロジェクト all_layers_template を作成して、C シミュレーションと C コードの合成を行った。今回は、C/RTL協調シミュレーションとExport RTL を行う。


全結合層のテンプレートの変 更
この前から畳み込みニューラルネットワーク(CNN)の層のテンプレートを作ってきた。今回、 MNISTのCNN を層のテンプレートで実装したのだが、BRAMのリソース使用量をオーバーしてしまったので、BRAMを多量に使用している第1層目のチューニングを変更する必要が出てき た。そのため、全結合層のテンプレートを変更することにした。

今まで作ってきた層のテンプ レートをMNIST のCNN に適用する1(C コードの合成1)
”全結合層のテンプレートの変更”で全結合層のテンプレートを変更したが、今まで作ってきた畳 み込みニューラルネットワーク(CNN) の層のテンプレートをMNIST のCNN に適用して、お手軽に素早くCNN をFPGAに実装できるかどうか?を確かめてみた。
今まで作ってきた層のテンプ レートをMNIST のCNN に適用する2(C コードの合成2)
前回は、MNISTのCNNを以前実装したときに比べて性能は84 倍になったが、リソース使用量がPYNQボードのZynq のPL 容量をオーバーしてしまった。今回は、PYNQボードのZynq に入るようにパラメータを設定しC コードの合成を行う。
その際に使用するのが、”全結合層のテンプレートの変更”で全結合層のテンプレートに追加した OUTPUT_PIPELINE_II だ。この値を変更することにより、リソース使用量を変更することができる。
今まで作ってきた層のテンプ レートをMNIST のCNN に適用する3(Export RTL まで)
前回は、PYNQボードのZynq に入るようにパラメータを設定しC コードの合成を行った。今回は、C シミュレーション、C/RTL 協調シミュレーション、Export RTL を行う。

TensorFlow + Kerasを使ってみた1(インストール編)
TensorFlow + Kerasを使ってみることにした。
「Zeroから作るDeep Learning」のコードは使いやすいし、自分で改造するのも容易なのだが、GPU 使えないし、少し大きなネットワークをやるには不安がある。そこで、TensorFlow+Kerasを使ってみることにした。
TensorFlow + Kerasを使ってみた2(実践編)
前回は、TensorFlow + Keras と Jupyter Notebook をインストールして、「Keras / Tensorflowで始めるディープラーニング入門」を参考にしてやってみることにした。今回は、「Keras / Tensorflowで始めるディープラーニング入門」のサンプルをJupyter Notebook でやってみよう。
TensorFlow + Kerasを使ってみた3(以前使用したCNNを使った学習)
”TensorFlow + Kerasを使ってみた2(実践編)”で使用した”Keras / Tensorflowで始めるディープラーニング入門”の Python コードをそのまま再利用させて頂いて、”「ゼロから作るDeep Learning」の畳み込みニューラルネットワークのハードウェア化5(再度学習)”の CNN を学習していこう。これは MNIST の手書き数字を認識するCNN で畳み込み層の特徴マップの数は 10 個となっている。
TensorFlow + Kerasを使ってみた4(modelの重みの表示)
とりあえずの私の CNN の実装としては層ごとの出力の値域、重みの変域、量子化された推論が必要なので、それらを TensorFlow + Keras でできるのかを探っていきたい。
使用しているのは、”TensorFlow + Kerasを使ってみた3(以前使用したCNNを使った学習)”のMNIST の畳み込み層 10 層の CNN だ。
まずは、モデル・パラメータの保存と読み込みをしたいと思う。また、モデルの重みを表示してみた。
TensorFlow + Kerasを使ってみた5(モデルの可視化、サーマリ)
前回はモデルの重みの表示をしてみた。今回は、モデルを可視化したり、サーマリを表示してみ た。
なお、使用するのは MNIST の手書き数字を認識するCNN で畳み込み層の特徴マップの数は 10 個となっている。
TensorFlow + Kerasを使ってみた6(層構成の変更、学習)
前回は、モデルの可視化で層の構成情報のPNGファイルを出力し、レイヤのサーマリを出力し た。今回は、層の構成を変更して、畳み込み層の学習を行った。
TensorFlow + Kerasを使ってみた7(畳み込み層の統計情報)
前回は、層の構成を変更して、学習を行った。今回は、畳み込み層の統計情報を取得してみよう。
TensorFlow + Kerasを使ってみた8(全結合層の統計情報)
前回は、畳み込み層の最大値、最小値、絶対値の最大値、最小値、標準偏差などの統計情報を取得 した。今回は、全結合層の統計情報を取得しよう。
TensorFlow + Kerasを使ってみた9(畳み込み層の重みをC のヘッダに変換)
前回は、全結合層の最大値、最小値、絶対値の最大値、最小値、標準偏差などの統計情報 を取得した。今回は、”「ゼロから作るDeep Learning」の畳み込みニューラルネットワークのハードウェア化3”で行った重みやバイアスを C ヘッダにするPython コードをKeras でうまく行くかどうか?を確かめてみよう。
TensorFlow + Kerasを使ってみた10(バイアスをC のヘッダに変換)
前回は、畳み込み層の重みをC のヘッダに変換した。今回は、畳み込み層、全結合層1層目、全結合層2層目のバイアスをC のヘッダファイルに変換する。
なお、量子化の精度の評価はまだできていないので、以前に使用した量子化ビット幅を使ってやってみよう。
TensorFlow + Kerasを使ってみた11(全結合層の重みをC のヘッダに変換)
前回は、畳み込み層、全結合層1層目、全結合層2層目のバイアスをC のヘッダファイルに変換した。今回は全結合層1層目、2層目の重みをC のヘッダに変換しよう。
TensorFlow + Kerasを使ってみた12(MNISTのデータの一部をC のヘッダに変換)
前回は全結合層1層目、2層目の重みをC のヘッダに変換した。今回は、MNISTのデータの一部をC のヘッダに変換してみよう。これは、Vivado HLS のC シミュレーション時に精度を確認するためのデータとなる。
TensorFlow + Kerasを使ってみた13(Vivado HLSで実装1)
前回は、MNISTのデータの一部をC のヘッダに変換した。今回は、今ままでの重みやバイアス、そして、MNISTのデータの一部を記述した C ヘッダを使用して、”今まで作ってきた層のテンプレートをMNIST のCNN に適用する3(Export RTL まで)”のVivado HLS プロジェクトに適用してみよう。
TensorFlow + Kerasを使ってみた14(Vivado HLSで実装2)
前回は、今ままでの重みやバイアス、そして、MNISTのデータの一部を記述した C ヘッダを使用して、”今まで作ってきた層のテンプレートをMNIST のCNN に適用する3(Export RTL まで)”のVivado HLS プロジェクトに適用してみたが、C シミュレーションをした時に、ほとんどのデータがエラーになってしまった。今回は、その原因を追求して原因を突き止めた。そして、もう一度、C シミュレーションを行ったところNo Error だった。成功した。
No Errorは間違いで、C シミュレーションを行ったところ、300 個の テストデータに対して、ソフトウェアのfloat 演算は 3 個、ハードウェアの固定小数点演算は 6 個のエラーが出た。
TensorFlow + Kerasを使ってみた15(飽和演算と通常の演算)
前回は、Keras から重みやバイアスを取り出して、Vivado HLS 2017.4 に実装したCNN をC シミュレーションしたところ、ソフトウェアのfloat 演算では精度 99 %、ハードウェアの固定小数点演算では、精度 98 % を確認することが出来た。今回は、畳み込み層に”Vivado HLS の任意精度固定小数点データ型の飽和演算”でテストした演算後の値を飽和演算し、また全結合層では内積の演算に飽和演算を用いる実装と、今まで通りにすべての演算に飽和演 算を用いない場合について検証してみよう。
TensorFlow + Kerasを使ってみた16(C コードの合成、ビット幅の削減)
前回は、畳み込み層に”Vivado HLS の任意精度固定小数点データ型の飽和演算”でテストした演算後の値を飽和演算し、また全結合層では内積の演算に飽和演算を用いる実装と、今まで通りにすべての演算に飽和演 算を用いない場合について検証した。今回は、その飽和演算ありと飽和演算なしの2つの実装を合成して、リソース使用量を比較して見た後 で、演算のビット幅を小さくして、C シミュレーション結果とC コードの合成結果を見ていこう。
TensorFlow + Kerasを使ってみた17(特徴マップを10個から5個へ)
前回は、各層の演算のビット幅をチェックしたが、ビット幅を小さくしても、思ったよう にリソース使用量が少なくならなかった。今回は、IP のレイテンシとリソース使用量に効くのはなんと言っても、畳み込み層の特徴マップの数じゃないか?と思う。今までは畳み込み層で 10 個の特徴マップを使用していたが、5 個ではどうだろうということでやってみた。
TensorFlow + Kerasを使ってみた18(特徴マップ5個のMNIST用CNNをVivado HLSで実装)
前回は、今までは畳み込み層で 10 個の特徴マップを使用していたが、5 個ではどうだろうということでやってみたところ、98.64 % の精度が確保できた。今回は、特徴マップ5 個のMNIST 用 CNN を使用して、Vivado HLS で実装してみた。
TensorFlow + Kerasを使ってみた19(特徴マップ3個と2個のMNIST用CNNをテスト)
特徴マップ5個のMNIST 用 CNN がうまく行ったようなので、特徴マップ 3 個と 2 個のMNIST 用CNN をKeras で学習させてみることにした。
TensorFlow + Kerasを使ってみた20(特徴マップ3個のMNIST用CNNをVivado HLSで実装)
前回は、MNIST 用のCNN で特徴マップが 3 個と 2 個の時について学習を行ったところ、3 個の場合の精度が 98.54 % で使い物になるようだった。特徴マップが 2 個の場合は、98.02 % で少し低くなっていた。今回は、MNIST 用のCNN で特徴マップが 3 個の場合をVivado HLS で実装してみよう。
TensorFlow + Kerasを使ってみた21(特徴マップ数が3個、5個、10個のMNIST用CNNをC/RTLコシムとIP化)
前回は、MNIST 用のCNN で特徴マップ数が 3 個の場合をVivado HLS で実装した。今回は、特徴マップ数が 3 個、 5 個、10 個のMNIST用CNNをC/RTL 強調シミュレーションと、Export RTL を行う。
TensorFlow + Kerasを使ってみた22(Linux版とWindows版のVivado HLSでの違い)
前回は、特徴マップ数が 3 個、 5 個、10 個のMNIST用CNNをC/RTL 強調シミュレーションと、Export RTL を行って、結果を比較した。今回は、前回はLinux 版のVivado HLS 2017.4 の結果だったが、Windows版のVivado HLS 2017.4 の結果も比較した。また、Vivado HLS 2018.1 で特徴マップが 3 個の場合をやってみたので比較した。

Kerasを使用したMNIST CNNで手書き文字認識1(以前のVivado プロジェクトをVivado 2017.4に変換)

”TensorFlow + Kerasを使ってみた22(Linux版とWindows版のVivado HLSでの違い)”までで作ってきたMNISTのCNNをVivado に組み込んで実機で動作させてみようと思う。とりあえずは、従来のフレームワークに入れて、HLSストリーム版のCNN が実際にうまく行くかを確認したい。

MNISTのCNN 用DMA IP 1(C シミュレーション)
MNISTのCNN 用のDMA IP を作成した。
MNISTのCNN は、ap_uint<8> のHLS ストリーム・データを入力する。よって、MNISTのCNN に手書き数字データを供給するために画像を切り取り 28 x 28 ピクセルのHLSストリーム・データを供給する mnist_square_dma IP を作成する。
MNISTのCNN 用DMA IP 2(C コードの合成、C/RTL 協調シミュレーション、Export RTL)
前回は、MNISTのCNN 用のDMA IP を作成し、C シミュレーションを行った。今回は、C コードの合成、C/RTL 協調シミュレーション、Export RTLを行った。

DMA付きテンプレートを使用したMNISTのCNN1(C ソースコード)
MNISTのCNN 用のDMA IP を”TensorFlow + Kerasを使ってみた20(特徴マップ3個のMNIST用CNNをVivado HLSで実装)”のテンプレートを使用した特徴マップ3個のMNIST のCNN に付けた。これで、PYNQ に搭載した”手書き数字認識用畳み込みニューラルネットワーク回路の製作3(畳み込みNN)”の入出力フォーマットと同じになったので、”Kerasを使用したMNIST CNNで手書き文字認識1(以前のVivado プロジェクトをVivado 2017.4に変換)”のmnist_conv_nn10_sDMA IP と入れ替えれば、DMA 付きテンプレートを使用したMNIST のCNN を試してみることができる。
DMA付きテンプレートを使用したMNISTのCNN2(C シミュレーション1)
前回は、DMA 付きテンプレートを使用したMNIST のCNN のC ソースコードを貼った。今回は、その C ソースコードを利用してC シミュレーションをしてみよう。
DMA付きテンプレートを使 用したMNISTのCNN3(C シミュレーション2)
DMA 付きテンプレートを使用したMNIST のCNN のC シミュレーションを行った。今回は、28 x 28 ピクセルの手書き数字の真ん中のエリアの0x80 より大きいピクセル数の数で手書き数字の位置を検出するというテストベンチを土日で書いていたが、失敗した。
DMA付きテンプレートを使 用したMNISTのCNN4(Cコードの合成、Export RTL)
前回は、28 x 28 ピクセルの手書き数字の真ん中のエリアの0x80 より大きいピクセル数の数で手書き数字の位置を検出するというテストベンチを土日で書いていたが、失敗した。今回は、位置を検出するのは諦めて、C コードの合成とExport RTL を行った。

Kerasを使用した MNIST CNNで手書き文字認識2(all_layers IP の挿入)
”Kerasを使用したMNIST CNNで手書き文字認識1(以前のVivado プロジェクトをVivado 2017.4に変換)”のCNN IP を削除して、”DMA付きテンプレートを使用したMNISTのCNN4(Cコードの合成、Export RTL)”で作成したIP をAdd IP したのだが、Add IPのリストに出てこなかった。そこで、Windows版のVivado HLS 2018.2 で再度IP化して、Vivado 2018.2 のVivado プロジェクトにAdd IP した。
Kerasを使用した MNIST CNNで手書き文字認識3(ビットストリームの生成、SDK)
前回は、”Kerasを使用したMNIST CNNで手書き文字認識1(以前のVivado プロジェクトをVivado 2017.4に変換)”のCNN IP を削除して、Windows版のVivado HLS 2018.2 で mnist_conv_nn3_hlss_ko_dma プロジェクトの all_layers IP を再度作成してAdd IP した。今回は PYNQ_MNIST_CNN3_182 フォルダVivado 2018.2 プロジェクトの論理合成、インプリメンテーション、ビットストリームの生成を行い、SDK でアプリケーションソフトの mnist_conv_soft_test.c を今回のプロジェクトに合うように変更した。
Kerasを使用した MNIST CNNで手書き文字認識4(実機確認)
前回は、 PYNQ_MNIST_CNN3_182 フォルダVivado 2018.2 プロジェクトの論理合成、インプリメンテーション、ビットストリームの生成を行い、SDK でアプリケーションソフトの mnist_conv_soft_test.c を今回のプロジェクトに合うように変更した。今回は、SDK でPYNQボードをコンフィギュレーションし、アプリケーションソフトの mnist_conv_soft_test.elf を起動してPYNQボードで動作を確認する。
Kerasを使用した MNIST CNNで手書き文字認識5(実機確認2)
前回は、SDK でPYNQボードをコンフィギュレーションし、アプリケーションソフトの mnist_conv_soft_test.elf を起動してPYNQボードで動作を確認した。今回はアプリケーションソフトを動作させて、自分で書いた手書き数字を認識させてみよう。
Kerasを使用した MNIST CNNで手書き文字認識6(実機確認3)
前回は、アプリケーションソフトを動作させて、自分で書いた手書き数字を認識させた が、1, 4, 6, 7 が誤認識してしまった。以前の 10 個の特徴マップのCNN では、正常に認識しているので、量子化の精度、および飽和演算に問題があるのか?はたまた過学習になっているのかを検証することになった。今回は、考えられる 2 つの原因の内の量子化の精度、および飽和演算について検証を行った。
Kerasを使用した MNIST CNNで手書き文字認識7(特徴マップが3個のMNISTのCNNを再学習)
前回は、考えられる 2 つの原因の内の量子化の精度、および飽和演算について検証を行ったが、浮動小数点数による特徴マップが3個のMNISTのCNN の演算でも手書き数字を誤認識していたので、量子化の精度、および飽和演算の問題ではないという結論になった。今回は、過学習が手書き数字の誤認識に影響しているのか?を 確かめるために、Epoch 数を変更して再学習を行った。
Kerasを使用した MNIST CNNで手書き文字認識8(特徴マップが3個のMNISTのCNNを再学習2)
前回は、過学習が手書き数字の誤認識に影響しているのか?を確かめるために、 Epoch 数を変更して再学習を行って、PYNQボードに実装して手書き数字の認識を確認した。今回は、その過程でVivado HLS で行った、精度の確認を書けなかったので、それを書いておく。
Kerasを使用した MNIST CNNで手書き文字認識9(特徴マップが10個のMNISTのCNNを再学習1)
前回は、MNIST のCNN の特徴マップが3個の時に過学習が手書き数字の誤認識に影響しているのか?を確かめるために、Epoch 数を変更して再学習を行った時の重みやバイアスをVivado HLS のC ヘッダ・ファイルとして代入した時の結果を示した。今回は、特徴マップが3個の時には、あまり精度の向上が見られなかったため、MNIST のCNN の特徴マップが10個の場合を再学習してVivado HLS で精度を確認してみようと思う。
Kerasを使用した MNIST CNNで手書き文字認識10(特徴マップが10個のMNISTのCNNを再学習2)
前回は、MNIST のCNN の特徴マップが10個の場合を再学習してVivado HLS で精度を確認した。今回は、Vivado HLSで精度を確認できたので、Vivado HLS 2018.2 で mnist_conv_nn10_hlss_ko_dma プロジェクトを作成して、IP 化を行い、PYNQ_MNIST_CNN10_182 フォルダのVivado 2018.2 プロジェクトを作成し、論理合成、インプリメンテーション、ビットストリームの生成を行った。
Kerasを使用した MNIST CNNで手書き文字認識11(特徴マップが10個のMNISTのCNNを再学習3)
前回は、Vivado HLS 2018.2 で mnist_conv_nn10_hlss_ko_dma プロジェクトを作成して、IP 化を行い、PYNQ_MNIST_CNN10_182 フォルダのVivado 2018.2 プロジェクトを作成し、論理合成、インプリメンテーション、ビットストリームの生成を行った。今回は、SDK を起動して、PYNQボードをコンフィギュレーションし、アプリケーションソフトを起動して、手書き数字の認識を行った。

Accelerating SqueezeNet on FPGAを実装してみた1(Vivado HLS編)
”Accelerating SqueezeNet on FPGA”を読んでいると、コードが”lankas/SqueezeNet”にあったので、Vivado HLS とVivado で実装してみよう。
今回は、”lankas/SqueezeNet”のFPGA フォルダの内容をVivado HLS 2018.2 でプロジェクトを作って確かめてみよう。
Accelerating SqueezeNet on FPGAを実装してみた2(Vivado 編 1)
前回は、”lankas/SqueezeNet”のFPGA フォルダの内容をVivado HLS 2018.2 でプロジェクトを作って確かめ、IP 化を行った。今回は、SqueezeNet の IP を使用するVivado 2018.2 のプロジェクトを作成しよう。
Accelerating SqueezeNet on FPGAを実装してみた3(Vivado 編 2)
前回は、SqueezeNet の IP を使用するVivado 2018.2 のプロジェクトを作成しSqueezeNet の compute IP をIP Catalog に登録した。今回は、Vivado でブロックデザインを作成し、回路を作っていく。
Accelerating SqueezeNet on FPGAを実装してみた4(Vivado 編 3)
前回は、SqueezeNet の IP を使用した回路をVivado で作成した。今回は、HDL Wrapper を作って、論理合成、インプリメンテーション、ビットストリームの生成を行う。
Accelerating SqueezeNet on FPGAを実装してみた5(Vivado 編 4)
前回は、HDL Wrapper を作って、論理合成、インプリメンテーション、ビットストリームの生成を行った。今回は、ハードウェアをエクスポートして、SDKを起動して、アプリケーションソフトを起 動してみよう。

Accelerating SqueezeNet on FPGAの構造について
”Accelerating SqueezeNet on FPGAを実装してみた5(Vivado 編 4)”で一応動いているように見えているのだが、画像はロードしていないし、重みもロードされいない気がする。
今回は、Accelerating SqueezeNet on FPGAの構造をメモしてみようと思う。
Accelerating SqueezeNet on FPGAの構造について2
前回は、Accelerating SqueezeNet on FPGAの構造でネットワークを構成する構造体を見ていった。今回は、そのlayer_t 構造体にどんな値が入力されているかを見ていこう。

「ゼロから作るDeep Learning」のMNISTデータを使用してKerasで学習する
「ゼロから作るDeep Learning」のMNISTデータを使用してKerasで学習してみた。これができると、「ゼロから作るDeep Learning」のMNISTデータの形にした白線間走行用CNNをKerasで学習させることができる。
白線間走行用CNNを Kerasで学習する
”「ゼロから作るDeep Learning」のMNISTデータを使用してKerasで学習する”で「ゼロから作るDeep Learning」のMNISTデータを使用してKerasで学習した。今回は、白線間走行用CNN をKeras で学習する。
白線間走行用CNNを Kerasで学習する2(各層の重みとバイアスの統計情報)
前回は、白線間走行用CNN をKeras で学習できた。今回は、学習した結果の重みやバイアスの統計情報を見ていこう。
白線間走行用CNNを Kerasで学習する3(各層の重みとバイアスをCのヘッダファイルに変換)
前回は、学習した結果の重みやバイアスの統計情報を見た。今回は、その重みやバイアスを Python コードを使用して C 言語のヘッダファイルに変換してみよう。
白線間走行用CNNを Kerasで学習する4(白線走行用テスト・データの一部をC のヘッダ・ファイルに変換)
前回は、重みやバイアスをPython コードを使用して C 言語のヘッダファイルに変換した。今回は、白線走行用テスト・データの一部をC のヘッダ・ファイルに変換する。

Kerasで学習した重みと バイアスを使用した白線間走行用CNNをVivado HLSで確かめる
すでに、「ゼロから作るDeep Learning」のPython コードを使用して、学習した重みとバイアスをC のヘッダファイルにしたものを使用してVivado HLSで精度を確かめたブログ記事が”カーブ、直線用白線間走行用畳み込みニューラルネットワーク11(Vivado HLS でCNN を実装)”だ。これを重みとバイアス以外は使用して、Kerasで学習した重みとバイアスのVivado HLS 2018.2 での精度を見てみよう。
Kerasで学習した重みと バイアスを使用した白線間走行用CNNをVivado HLSで確かめる2
前回は、「ゼロから作るDeep Learning」のPython コードを使用して、学習した重みとバイアスをC のヘッダファイルにしたものを使用してVivado HLSで精度を確かめたブログ記事が”カーブ、直線用白線間走行用畳み込みニューラルネットワーク11(Vivado HLS でCNN を実装)”だ。これを重みとバイアス以外は使用して、Kerasで学習した重みとバイアスのVivado HLS 2018.2 での精度を見た。今回は、C コードの合成をやってみよう。

Kerasで学習した重みと バイアスを使用した白線間走行用CNNのVivado プロジェクト1
だいぶ前になってしまったが、”Kerasで学習した重みとバイアスを使用した白線間 走行用CNNをIPにする2”で、”カーブ、直線用白線間走行用畳み込みニューラルネットワーク13(AXI4 Stream版CNN IP 1)”の curve_conv_nn2_axis3 プロジェクトを利用して、curve_conv_nn2_axis3_k プロジェクトを作成し、Export RTLでIP 化を行った。
今回は、そのIP を使用して、”カーブ、直線用白線間走行用畳み込みニューラルネットワーク15(Vivadoプロジェクト)”のVivado プロジェクトをバージョン 2018.2 に変更し、curve_conv_nn2_axis3 を”Kerasで学習した重みとバイアスを使用した白線間走行用CNNをIPにする2”で作成したIP と交換して、ZYBO_0_182_9_k フォルダに保存した。

SqueezeNet for MNIST 1
Squeezenet をFPGA に実装したいので、重みとバイアスを C のヘッダにしたいと思っているのだが、ImagkeNetの画像を使って学習するのも大変だけど、ImagkeNetの画像を集めて学習する方法を探っていた。その時に、 SqueezeNet for MNIST を見つけた。とりあえず、MNISTのデータだったらKeras に標準で付いているし、手始めにこれをやってみることにした。それにLicense も Apache License 2.0 なので、都合が良い。
SqueezeNet for MNIST 2
前回は、SqueezeNet for MNIST の学習を行った。今回は、model accuracy と model loss を示し、model.summary() を示す。

「Keras Tutorial : Using pre-trained Imagenet models」を試してみる
「Keras Tutorial : Using pre-trained Imagenet models」を試してみようと思う。このページでは、ImagNet で事前に学習させた各ネットワークの重みやバイアスを使用して、vgg_model、inception_model、resnet_model、 mobilenet_model の実力を探る企画のようだ。

Duplicate IP の製作1(ソースコード)
SqueezeNet4mnist をVivado HLSのテンプレートで実装しようと思ったときに、1つのHLSストリームを 2 つのHLSストリームに分ける Duplicate IP と 2 つのHLSストリームを 1 つのHLSストリームにする Concatenate IP が必要となる。
今回は、Duplicate IP を作ってみよう。
Duplicate IP の製作2(Vivado HLS プロジェクト)
前回は、1 つの HLS ストリームを 2 つにするDuplicate IP のソースコードを示した。今回は、そのソースコードを使用して、Vivado HLS 2018.2 のプロジェクトを作成して、IP 化まで行う。

Concatenate IP の作成1
今回は Concatenate IP をVivado HLS 2018.2 で作成してみよう。
Concatenate IP は 2 つのHLS ストリームを 1 つのHLS ストリームにマージするIP で、SqueezeNet を実装するために必要となる。
Concatenate IP の作成2
前回は、Concatenate IP のソースコードを貼った。今回は、C シミュレーション、C コードの合成、C/RTL 協調シミュレーション、Export RLT を行う。

SqueezeNet for MNIST のVivado HLS での試行1
”SqueezeNet for MNIST 3(層の統計情報とC ヘッダ・ファイルへの出力)”で層の統計情報と重みやバイアスの C ヘッダ・ファイルを出力したので、それらを使用して、SqueezeNet for MNISTで、どのくらいのリソースが必要なのかを探ってみた。
とりあえずは、層の内の第1層目の畳み込み層、ReLU, MaxPooling の 3 つを実装してみよう。
なお、実装には、conv_layer_template.h, relu_template.h, max_pooling_template.h を使用している。
SqueezeNet for MNIST のVivado HLS での試行2
”SqueezeNet for MNIST 3(層の統計情報とC ヘッダ・ファイルへの出力)”で層の統計情報と重みやバイアスの C ヘッダ・ファイルを出力したので、それらを使用して、SqueezeNet for MNISTで、どのくらいのリソースが必要なのかを探ってみようということで、前回はソースコードを示した。今回はC コードの合成結果を示す。
SqueezeNet for MNIST のVivado HLS での試行3
前回はSqueezeNet for MNISTで、どのくらいのリソースが必要なのかを探ってみようということで、C コードの合成を行って、結果を調べた。今回は、Vivado synthesis, place and route にチェックを入れてExport RTL を行い、合成結果と比較した。

icrawler で学習用画像を収集する
”機械学習用の画像を集めるのにicrawlerが便利だった”で icrawler を使って学習用画像を収集していたが、なかなかうまく行かなかったので、顛末を書く。

SqueezeNet for MNIST で層の数を減らして、各層の出力をC のヘッダに出力
今まで SqueezeNet for MNIST をやってきたが、MNIST の手書き数字の分類を行うのにフルのSqueezeNet は大きすぎると思う。
そこで、SqueezeNet の特徴を残しながら、fire 層を 1 層にしたモデルをやってみた。

トランジスタ技術2018年 11月号に記事を書きました
トランジスタ技術2018年11月号に「第4章 MNIST向け固定小数点CNNの設計から, 各種シミュレーション,実装まで 手書き数字認識用FPGAニューラル・ネットワーク・システムの製作」という記事を書きました。

Anaconda でインストールしたJupyter Notebookを任意のフォルダから実行する方法
Windows 10 の Anaconda でインストールしたJupyter Notebookを任意のフォルダから実行したい。特に C: ドライブにSSD が入っているとあまり容量に余裕がない場合は、D: ドライブで思う存分、学習用の画像ファイルを扱いたい(GBオーダーの容量を必要とするため)。という欲求があるので、C: ドライブじゃないところから起動したい。

DeepLearningの モデル軽量化 Distiller を試す1
tkato さんの tkato's blog の”DistillerでDeepLearningのモデルを軽量化: Gradual Pruning編”を参考にして、DeepLearningのモデル軽量化 Distiller を試してみようと思う。
DeepLearningのモデル軽量化 Distiller を試す2
前回は、tkato さんの tkato's blog の”DistillerでDeepLearningのモデルを軽量化: Gradual Pruning編”を参考にして、DeepLearningのモデル軽量化 Distiller を試してみようと言うことで、git clone で Distiller をクローンした。今回は、simplenet_cifar を学習し、Gradual Pruningのサンプルを動作させてみよう。
DeepLearningの モデル軽量化 Distiller を試す3
前回は、tkato さんの tkato's blog の”DistillerでDeepLearningのモデルを軽量化: Gradual Pruning編”を参考にsimplenet_cifar を学習し、Gradual Pruningのサンプルを動作させたが、YMAL ファイルに記述した Gradual Pruning は行われなかった。今回は、”DistillerでDeepLearningのモデルを軽量化: Gradual Pruning編”の残りをやってみよう。
DeepLearningの モデル軽量化 Distiller を試す4
”DeepLearningのモデル軽量化 Distiller を試す2”でGradual Pruning をやってみたがうまく行かなかった。
@_tkato_ さんから修正情報をいただいたので、もう一度やってみよう。ありがとうございました。
DeepLearningの モデル軽量化 Distiller を試す5
GitHub のNervanaSystems/distiller の量子化サンプルをやってみよう。

keras_compressor を試してみる1
Distiller の次は、keras_compressor を試してみたい。
keras_compressor の元ネタは”モデル圧縮”で、そのGitHubが”DwangoMediaVillage/keras_compressor”だ。ドワンゴの方のようだ。
keras_compressor を試してみる2
前回は、Distiller の次は、keras_compressor を試してみたいということで、Docker のビルドから起動、git clone と環境整備を行った。今回は、MNIST のトレーニングと圧縮、ファイン・チューニングを行う。
keras_compressor を試してみる3
前回は、MNIST のトレーニングと圧縮、ファイン・チューニングを行った。今回は、各モデルを評価してみよう。

keras_compressor のモデルをVivado HLSで実装する1(model_raw.h5)
”keras_compressor を試してみる3”までで作成できた畳み込みニューラルネットワークのモデルをVivado HLS のこれまでのスキームで実装してみようと思う。
keras_compressor のモデルをVivado HLSで実装する2(model_raw.h5 畳み込み層第2層目)
前回は、ホストUbuntu 18.04 に 3 つのモデルをコピーして、まずは大きいので実装はできないと思う圧縮前のモデルのパラメータの内の畳み込み層第1層目のパラメータを見た。今回は、畳み込み層第2層目のパ ラメータを見てみよう。
keras_compressor のモデルをVivado HLSで実装する3(model_raw.h5 全結合層第1層目)
前回は、keras compressor のMNIST サンプルの model_raw.h5 の畳み込み層第2層目を解析した。今回は、全結合層の第1層目をやってみよう。
keras_compressor のモデルをVivado HLSで実装する4(model_raw.h5 全結合層第2層目)
前回は、keras compressor のMNIST サンプルの model_raw.h5 の全結合層の第1層目を解析した。今回は、全結合層の第2層目をやってみよう。
keras_compressor のモデルをVivado HLSで実装する5(model_raw.h5 の畳み込み層の重みをCヘッダに変換)
前回は、keras compressor のMNIST サンプルの model_raw.h5 の全結合層の第2層目を解析した。今回はいよいよ畳み込み層の重みとバイアスをC のヘッダに変換してみよう。
畳み込み層の重みをCヘッダファイルに書き出す関数 fwrite_conv_weight() を定義する。

keras_compressor を試してみる4(Cifer10 その1)
前回は、MNIST のトレーニングと圧縮、ファイン・チューニングを行ったときのモデルを評価した。今回は、cifar10 の場合をやってみよう。トレーニング、圧縮、ファイン・チューニングを行う。
keras_compressor を試してみる5(Cifer10 その2)
前回は、Cifar10 のトレーニング、圧縮、ファイン・チューニングを行った。今回は生成された 3 つのモデルの評価を行う。

BinaryBrain Version 3 を試してみよう1
ryuz/BinaryBrain のBinaryBrain Version 3 を試してみよう。
BinaryBrain はFPGA の6 入力LUT を学習させて推論してしまうというネットワークのようだ。こうするととても少ないロジックでネットワークを構成することができる。
BinaryBrain Version 3 を試してみよう2
前回、ryuz/BinaryBrain のBinaryBrain Version 3 を Nvidia Docker で試してみたが、コンパイル時にエラーになってしまった。今回は、Docker を使用しないでやってみた。
BinaryBrain Version 3 を試してみよう3
前回は、ryuz/BinaryBrain のBinaryBrain Version 3 をコンパイルして実行したが、バージョンが新しくなったということで、もう一度やってみよう。
BinaryBrain Version 3 を試してみよう4
再度、ryuz/BinaryBrain のBinaryBrain Version 3 がバージョンアップされたので、やり直ししてみよう。

hls4mlをやってみた1
hls4ml をやってみた。hls4ml はVivado HLS を使用して機械学習をハードウェア化するフレームワークだ。
なお、OS は Ubuntu 18.04 を使用している。
hls4mlをやってみた 2(KERAS_3layer ネットワークの構成)
前回は、Vivado HLS を使用して機械学習をハードウェア化するフレームワークのhls4ml をインストールし、KERAS_3layer ネットワークをVivado HLS のプロジェクトとして生成し、C シミュレーション、C コードの合成、C/RTL 協調シミュレーション、Export RTL をTCL スクリプトで行った。今回は、Vivado HLS のIP として生成した KERAS_3layer ネットワークがどのようななネットワークか知らないので、調べていこう。
hls4mlをやってみた3(シ ミュレーション)
前回は、Vivado HLS を使用して機械学習をハードウェア化するフレームワークのhls4ml を使用してVivado HLS のIP として生成した KERAS_3layer ネットワークがどのようななネットワークか知らないので調査した。今回は、そのVivado HLS プロジェクトの myproject_prj の C シミュレーションとC/RTL 協調シミュレーションの結果を見ていこう。
hls4mlをやってみた 4(KERAS_conv1d_small_nfilt5その1)
前回は、ivado HLS プロジェクトの myproject_prj の C シミュレーションとC/RTL 協調シミュレーションの結果を見た。今回は、異なるネットワークを自分で yml ファイルを作成してやってみよう。
hls4mlをやってみた 5(KERAS_conv1d_small_nfilt5その2)
前回は、KERAS_conv1d_small_nfilt5 ネットワークをビルドして、C コードの合成結果を観察した。今回は、KERAS_conv1d_small_nfilt5 のネットワーク構造を調べていこう。
hls4mlをやってみた6(自 分で学習したネットワークをhls4mlでハードウェア化1)
前回は、KERAS_conv1d_small_nfilt5 のネットワーク構造を調べた。今回は、白線追従ロボットカーの学習データ keras_curve_cnn2_line を hls4ml でVivado HLS 2019.1 のプロジェクトにしてみよう。
hls4mlをやってみた7(自 分で学習したネットワークをhls4mlでハードウェア化2)
前回は、白線追従ロボットカーの学習データ keras_curve_cnn2_line を hls4ml でVivado HLS 2019.1 のプロジェクトにしようということで、白線追従ロボットカーの学習データのネットワーク構造と重みのファイルを出力した。今回は、それをhls4ml でVivado HLS のプロジェクトにしてみよう。

DPU on PYNQ をやってみる1(PYNQ v2.5 をアップグレード)
DPU on PYNQ をやってみようと思う。これは、Vitis AI DPU が含まれている PYNQ プラットフォームということだ。
PYNQ v2.5 のアップグレードとして提供されているので、”Ultra96-V2にPYNQをインストールした時のusb0のIPアドレスの変更方法”で PYNQ v2.5 をインストールしたわけである。苦労はしたが、ホストパソコンから SSH で Ultra96-V2 の PYNQ にログインすることができるようになった。
さて、ここから DPU on PYNQ をインストールしていこう。
DPU on PYNQ と ikwzm さんのUbuntu で使用できた USB - LAN ケーブル覚書(Ultra96-V2用)
Ultra96-V2 の DPU on PYNQ と ikwzm さんのUbuntu で使用できた USB - LAN ケーブルを書いておく。

DPU on PYNQ をやってみる2(dpu_inception_v1.ipynb をやってみた)
DPU on PYNQ をやってみようと思う。これは、Vitis AI DPU が含まれている PYNQ プラットフォームということだ。
前回は、 DPU on PYNQ をインストールすることができた。今回は、dpu_inception_v1.ipynb をやってみた。
DPU on PYNQ をやってみる3(dpu_mnist_classifier.ipynb をやってみた)
前回は、DPU on PYNQ の dpu_inception_v1.ipynb をやってみた。今回は、 dpu_mnist_classifier.ipynb をやってみよう。

DPU on PYNQ のMNIST 推論と自分で作ったテンプレートを使用した CNN の MNIST 推論の速度を比較する
”DPU on PYNQ をやってみる3(dpu_mnist_classifier.ipynb をやってみた)”で DPU on PYNQ を使用した時の MNIST の推論速度を計測した。それは 1 文字辺り約 599 us だった。
それでは、自分で Vivado HLS を使用して作ったテンプレートを使用した CNN の MNIST の推論速度と比べてみようと思う。
DPU on PYNQ をやってみる4(dpu_resnet50.ipynb をやってみた)
前回は、DPU on PYNQ の dpu_mnist_classifier.ipynb をやってみた。今回は、DPU on PYNQ の dpu_resnet50.ipynb をやってみよう。
今回は、Pybind11を利用してC ++ DNNDK APIを呼び出す方法をやっていくようだ。
DPU on PYNQ をやってみる5(dpu_yolo_v3.ipynb をやってみた)
前回は、DPU on PYNQ の dpu_resnet50.ipynb をやってみた。今回は、DPU on PYNQ の dpu_yolo_v3.ipynb をやってみた。

ONNX と keras2onnx をインストールする
オライリー出版社の”「ゼロから作るDeep Learning」”の CNN から NNgen を使って CNN のハードウェアを生成する試みはとりあえず成功しなかった。今度は、ONNX モデルから NNgen に変換してみよう。ということで、自分の Ubuntu 18.04 LTS に tensorflow, keras, onnx, keras2onnx, onnxruntiome をインストールした。

”The Dobble Challenge”をやってみる1
”The Dobble Challenge”をやってみようと思う。
これは、3 個の記事がセットになっていて、最初の
”The Dobble Challenge”
で数学とデータセットを学んで、
”Training The Dobble Challenge”
で、Dobbleプレイング機械学習モデルを学習してテストし、
”Deploying the Dobble Challenge on the Ultra96-V2”
で”Training The Dobble Challenge”のモデルを Vitis-AI を使って、Ultra96V2 にデプロイしている。
正に、自分で作成した DNN を Vitis-AI を使用して、Ultra96V2 にデプロイするためのチュートリアルとして使用できるはずだ。
”The Dobble Challenge”をやってみる2
”The Dobble Challenge”をやってみようと思うということで、前回は、パッケージをインストールして、環境を整えた。
今回は、”The Dobble Challenge”を最後までやってみようと思う。
”Training The Dobble Challenge”をやってみる1
前回は、”The Dobble Challenge”を最後まで行ったが、Deck は 2 個表示されただけで、ソフトウェアがデッドロックしてしまった。
今回は、”Training The Dobble Challenge”に従って、 Dobble の CNN モデルをトレーニングしてみよう。
”Training The Dobble Challenge”をやってみる2
前回は、”Training The Dobble Challenge”に従って、 Dobble の CNN モデルをトレーニングして見ようということで、畳込み(アクティベーションは relu)+マックス・プーリングが 3 層とドロップアウト、全結合層、アクティベーション(relu)、全結合層、アクティベーション(softmax)の CNN を学習してテストした。今回は、”Training The Dobble Challenge”の残りをやってみよう。
”Deploying the Dobble Challenge on the Ultra96-V2”をやってみる1
前回は、 ”Training The Dobble Challenge”の残りを行って、Dobble の画像を増やして学習し、テスト・データでの精度が向上するのを確認できた。
今回は、”Deploying the Dobble Challenge on the Ultra96-V2”をやってみることにする。
”Deploying the Dobble Challenge on the Ultra96-V2”をやってみる2
前回は、”Deploying the Dobble Challenge on the Ultra96-V2”をやり始めて、Vitis-AI を Docker で起動し、環境設定、Keras のモデルから TensorFlow互換のフリーズグラフに変換、TensorFlow互換のフリーズグラフを評価し、99.42 % の精度があることを確認できた。
今回は、前回の続きからで、”Deploying the Dobble Challenge on the Ultra96-V2”を見ながら、パソコンでの作業が終了するまでやってみよう。つまり、フリーズグラフの量子化、量子化モデルの評価、量子化モデルのコンパイル、ボー ド上で実行するために必要なすべてのファイルを./build/targetフォルダにコピーを行う。
”Deploying the Dobble Challenge on the Ultra96-V2”をやってみる3
前回は、”Deploying the Dobble Challenge on the Ultra96-V2”を見ながら、パソコンでの作業が終了するまでやってみた。つまり、フリーズグラフの量子化、量子化モデルの評価、量子化モデルのコンパイル、ボード 上で実行するために必要なすべてのファイルを./build/targetフォルダにコピーを行った。
今回は、”Deploying the Dobble Challenge on the Ultra96-V2”の残り、 ./build/targetフォルダの内容を Ultra96V2 にコピーして、Ultra96V2 に接続した USB カメラで Dobble を認識してみよう。



inserted by FC2 system