TensorFlow, Keras

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ボードをコンフィギュレーションし、アプリケーションソフトを起動して、手書き数字の認識を行った。

「ゼロから作る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をIPにする1
”Kerasで学習した重みとバイアスを使用した白線間走行用CNNをVivado HLSで確かめる”
”Kerasで学習した重みとバイアスを使用した白線間走行用CNNをVivado HLSで確かめる2”
で、Kerasで学習した重みとバイアスは使えるということが分かったので、実際にIP 化してみよう。
Kerasで学習した重みと バイアスを使用した白線間走行用CNNをIPにする2
前回は、”カーブ、直線用白線間走行用畳み込みニューラルネットワーク13(AXI4 Stream版CNN IP 1)”の curve_conv_nn2_axis3 プロジェクトを利用して、curve_conv_nn2_axis3_k プロジェクトを作成し、C シミュレーションを行った。今回は、C コードの合成、Export RTLを行う。

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 フォルダに保存した。




inserted by FC2 system