こんにちは。
ディープラーニングお兄さんの”はやぶさ”@Cpp_Learningです。
前回、Sony製の深層学習フレームワーク “Neural Network Libraries(NNabla)” のPython APIと学習済みモデル(MyChain.h5)による推論を実践するチュートリアル記事を書きました。
↑記事の終盤で学習済みモデル”MyChain.nnp”を保存しました。
今回は、この学習済みモデル”MyChain.nnp”を使って推論を実践します。
Contents
学習済みモデルとは
学習済みモデルについて以下の記事で説明済みです。
なので、学習済みモデルについては、少し復習するだけにします。
【復習】Neural Network Libraries(NNabla)と学習済みモデル
“Neural Network Libraries”の場合、ニューラルネットワークは以下の形式で保存します。
ファイル | 内容 |
net.nntxt | ニューラルネットワークの構造(アーキテクチャ) |
parameters.h5 | ニューラルネットワークの重み(パラメータ) |
net_param.nnp | ニューラルネットワークの構造と重み |
つまり、ニューラルネットワークの構造と重みが”MyChain.nnp”に保存してあります。
【実践】学習済みモデル(NNPファイル)による推論
NNableのPython APIと学習済みモデル(NNPファイル)を使って推論を行います。
学習済みモデル(HDF5ファイル)による推論用のソースコードと共通している部分も多いです。見比べてみてね。
import
nnablaの各モジュールをimportします。推論では最適化アルゴリズム(Solvers)を使いません。
1 2 3 4 |
import nnabla as nn import nnabla.functions as F import nnabla.parametric_functions as PF # import nnabla.solvers as S |
その他、今回使用する数値演算モジュールなどもimportします。
1 2 |
import numpy as np import matplotlib.pyplot as plt |
NNabla用の変数定義
NNablaで学習および推論を行うために専用の変数を定義します。
1 2 |
batch_size = 1 x = nn.Variable((batch_size, 1)) |
学習済みモデル(重み + 構造)を読込む
学習済みモデル”MyChain.nnp”から”重み”と”アーキテクチャ”をロードします。
1 2 3 4 5 6 7 |
from nnabla.utils.nnp_graph import NnpLoader # Read a .nnp file. nnp = NnpLoader("MyChain.nnp") # Assume a graph `graph_a` is in the nnp file. net = nnp.get_network("MyChain", batch_size) |
たった3行で学習済みモデル(NNPファイル)の読込みができました。
推論から推論結果のグラフ化まで
推論から推論結果をグラフ化するまでのソースコードは以下の通りです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
# Test data1 xe = np.array([[0.5], [1.8], [2.3], [3.3], [4.5], [5.4], [6.3], [6.7], [7.4], [8.2]]) ye_list = [] # Predict1 using xe for i in xe: x.d = i # `x` is an input of the graph. x = net.inputs['x'] # 'y' is an outputs of the graph. y = net.outputs['y'] # y.forward(clear_buffer=True) y.forward() ye_list.append(y.d.copy()) # print('output:', x.d) # Test data2 yt_list = [] xt = [] # Predict2 using x = 0~9 for i in range(10): x.d = i y.forward() yt_list.append(y.d.copy()) xt.append(i) # plot Predict result ye = np.reshape(ye_list, [10, 1]) yt = np.reshape(yt_list, [10, 1]) plt.plot(xe, ye, "ro") plt.plot(xt, yt) plt.title("Predict result") plt.xlabel("input") plt.ylabel("output") plt.grid(True) plt.show() # Chack # print(xe) # print(ye) |
前回の”MyChain.h5”による推論結果と同じ結果が得られました。
組み込み深層学習
少しだけ、組み込みシステムに深層学習を適用することを意識したソースコードも公開
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
import nnabla as nn import nnabla.functions as F import nnabla.parametric_functions as PF from nnabla.utils.nnp_graph import NnpLoader import numpy as np batch_size = 1 x = nn.Variable((batch_size, 1)) y = nn.Variable((batch_size, 1)) # Read a .nnp file. nnp = NnpLoader("MyChain.nnp") # Assume a graph `graph_a` is in the nnp file. net = nnp.get_network("MyChain", batch_size) # Test data xe = np.array([[0.5], [1.8], [2.3], [3.3], [4.5], [5.4], [6.3], [6.7], [7.4], [8.2]]) ye_list = [] # Predict1 using xe for i in xe: x.d = i # `x` is an input of the graph. x = net.inputs['x'] # 'y' is an outputs of the graph. y = net.outputs['y'] # y.forward(clear_buffer=True) y.forward() ye_list.append(y.d.copy()) # Chack ye = np.reshape(ye_list, [10, 1]) print(xe) print(ye) |
推論結果のグラフ化などの余分なコードを削除し、入力値xeに対する推論値yeを出力するだけのコンパクトなソースコードに仕上げました。
と喜んでくれる人もいれば…
とガッカリした人もいるかも(?)
↑の記事で“Neural Network Libraries(NNabla)”の特徴を説明していますが、C++で推論もできますよ。
“Neural Network Libraries” のコア部分がC++で実装されており、Python APIだけでなく、C++ APIも用意してあります。
そのため、Python・C++どちらでも学習と推論ができるし、以下のこともできます。
【学習フェーズ(Python API)】
- Python APIでニューラルネットワークを設計
- 学習(ニューラルネットワークの”重み”を調整)
- 学習済みモデルをNNPファイルに保存
【推論フェーズ(C++ API)】
- C++ APIで学習済みモデル(NNPファイル)を読込む
- センサ値などモデルへの入力値を取得
- 推論(入力値に対する推論値を取得)
- 推論値を使って”ごにょごにょ”する(制御とか)
このようなPythonで学習 ⇒ C++で推論という一連の処理をシームレスに実現できます。
学習フェーズのところは、Neural Network Consoleを使ってもOKです。
- “Neural Network Libraries”にはPython APIとC++ APIがあります
- “Neural Network Libraries”のコアがC++で実装
- 学習はPython・推論はC++という一連の処理をシームレスに実現
- 学習済みモデルの生成はNeural Network ConsoleでもOK
まとめ
Sony製の深層学習フレームワーク “Neural Network Libraries(NNabla)” と学習済みモデル(NNP)を使った推論を実践しました。
また、組み込みシステムと深層学習についても少しだけ説明しました。
悩みは尽きませんが…
本記事を読んで「組込みシステムと深層学習に興味をもった!」という人が現れたら、ディープラーニングお兄さんはすごく嬉しい!