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
を認識してみよう。