1年ほど前、ソニー Neural Network Console と エクセルで始める ニューラルネットワークを投稿しました。
Neural Network Console(以下、NNC)は、プログラムを組まずとも、ニューラルネットワークの設計・学習・検証・推論できるようになっています。インストールも展開するだけなので、Windowsでニューラルネットワークを始めようと思っている方には、おすすめのソフトウェアです。いろいろ使っていくと、学習結果を使て推論だけのシステムを作りたくなることでしょう。折角、学習したネットワークをクラウドやエッジで使わないのはもったいないと考えている方も多いと思います。
今回は、NNCで学習したネットワークを用いて、同じくソニーが公開しているNeural Network libraries(通称、nnabla。以下、nnabla)を使うことで、驚くほど簡単に推論システムを作る方法をご紹介します。
1.ゴール設定
このブログでは、
* AIエンジニア1がネットワークを作り、NNCで教師データを学習させて、プログラマ2にその結果を渡す
* プログラマが、その結果を使って、推論システム3を作る
というプロセスを考えます。
2.プログラマに渡すものは、results.nnp だけ
NNCで学習させた結果は、通常、results.nnpというファイルに保存されています。AIエンジニアは、このresults.nnpだけをプログラマに渡してください。4
次に、ネットワーク図とconfigタブのExcutor欄のNetwork変数の値5を伝えてください。
最後に、入力のデータ形式(JPEGファイルとかCSVファイルとか)や出力形式(画像ファイルとか標準出力で数値とか)がどうなっているか等の情報交換をしてください。6
AIエンジニアはこれでこの業務は完了です。7
3.results.nnpをチェックする
プログラマは伝えられた各種情報とresults.nnpをチェックする以下のプログラム結果を照らして、推論ネットワーク名、入出力名8を決定してください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
from nnabla.utils.nnp_graph import NnpLoader import os nnppath = "results.nnp" if os.path.isfile(nnppath): # Read a .nnp file. nnp = NnpLoader(nnppath) for x in nnp.get_network_names(): print("----------\nNetworks:", x) net = nnp.get_network(x, batch_size = 1) for y in net.inputs: print("Inputs: ", y) for z in net.outputs: print("Outputs: ",z) |
例
例えば、このようなネットワークを「Main」(既定値)として作った場合、
自動的に、「MainValidation」と「MainRuntime」が生成され、configのExecutor欄のNetworkに「MainRuntime」が登録されています。これが推論で使用するネットワークです。
先ほどのチェックプログラムを実行すると
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
---------- Networks: Main Inputs: BinaryCrossEntropy_T Inputs: Input Outputs: BinaryCrossEntropy ---------- Networks: MainValidation Inputs: BinaryCrossEntropy_T Inputs: Input Outputs: BinaryCrossEntropy ---------- Networks: MainRuntime Inputs: Input Outputs: Sigmoid |
結果はこんな感じになりますので、「MainRuntime」のInputsとOutputsの名前をメモリます。
推論プログラムの作成
先ほどメモした、「推論ネットワーク名」、「入力名」、「出力名」を以下のように指定すれば、大体終わりです。大体といったのは、実際にxに入れるデータの読み込みや出力の仕方などを書かなければなりませんので、自分のデータに合わせて記述してください。
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 |
import nnabla as nn from nnabla.utils.nnp_graph import NnpLoader import nnabla.functions as F import nnabla.parametric_functions as PF # 入力データが画像の時に使うユーティリティライブラリ from nnabla.utils.image_utils import imread import os nnppath = "results.nnp" if os.path.isfile(nnppath): # Read a .nnp file. nnp = NnpLoader(nnppath) #net = nnp.get_network("推論ネットワーク名",batch_size = 1) net = nnp.get_network("MainRuntime", batch_size = 1) #x = net.inputs['入力名'] x = net.inputs['Input'] #y = net.outputs['出力名'] y = net.outputs['Sigmoid'] # 入力データが画像の場合はこんな感じ img = imread(imagefilename, channel_first=True) # 教師用データを255で正規化していたら255で割る x.d = img/255.0 y.forward(clear_buffer=True) print("inference: ",y.d) |
まとめ
デフォルトのMainネットワークだけで構築したNNCの学習済みネットワークは、nnpファイルだけで、推論プログラムが簡単9に書けることがわかっていただけたと思います。このようにNNCを使うと、AIエンジニアはネットワーク設計のみに専念でき、システムエンジニアはnnablaを使った推論プログラムが可能になり、分業化10できますね。
プログラミングはちょっと不得意だけど、分析は得意だからやりたいとかディープラーニングも使った分析がしたいとかお考えのあなた!いい環境ありますよ。まずはお問い合わせください。
- この場合、AIエンジニアはプログラムが組めなくても問題ありません。 ↩
- ここでは、pythonプログラマを想定しています。ここでは紹介しませんが、C++でもできます。 ↩
- 入力データを入れて、対応する何か(分類なら分類結果、回帰なら予測結果)を出力するシステムのことです。 ↩
- ネットワーク構造ファイル(net.nntxt)やNNC上でExportできるpythonコードはいりません。 ↩
- 推論ネットワーク名です。デフォルトは”MainRuntime”です。 ↩
- なんなら、results.nnpが含まれているフォルダー丸ごと渡せばいいんですけどね。 ↩
- 次の案件に移りましょう。 ↩
- 入力が1つで、出力が1つとは限りません。 ↩
- ほとんどの場合、推論ネットワーク=MainRuntime、入力名=Inputなので、出力名だけ変えればよいだけです。 ↩
- 個人として分業化がいいかどうかわかりませんが、会社的な効率は上がるハズです。 ↩