EXCELとNeural Network Console(ニューラルネットワークコンソール:以後NNC)を連携させて簡単なデモンストレーションを動かす例をやります。
前提のお話
EXCELとNeural Network Console(ニューラルネットワークコンソール:以後NNC)を連携させて、定義モデルと学習済パラメータを使って推論をやってみました。
でも、前回のパターンだと、単に推論する対象データ(画像)を他で用意して、処理(NNabla_cli.exe)をEXCELから呼び出しているにすぎません。
やっぱり、EXCELのセルに入力した文章とかをデータとして渡して、推論を実行するパターンもやっとかないと片手落ちっぽいので、ちょっと試してみます。
EXCELとNNCを連携するデモの処理フロー
結論を先に書いてしまうと、以下の順序にしないとうまくいきませんでした。
- EXCELのセルの内容をUTF-8でテキストファイルに保存する
- 保存したファイルをPythonで読み込み、NNC用データとデータセットCSVを生成する
- NNC用データをファイルで保存後、NNabla_cli.exeを起動する
全体の流れを図にするとこんな感じです。
連携のポイントはデータはpythonだけで作ること
特に「NNC用データ作成(前処理)」は、学習時のデータ作成に使ったのと同じものを使わないといけない・・というのはポイントです。
つまり。
データ作成はすべてpythonに統一するということです。
普通に考えれば、同じロジックをVBA側に実装して、いきなりNNC用データをEXCEL VBAで作ったらいいじゃないかとなりますが、それではうまくいきません。
実際、自分もやってみたのですが。
同じロジックでやっても、VBAとpythonでは同じデータができませんでした。
そもそも、小数点以下の精度(桁数)が違います。
VBAは小数点以下15桁目以降は0に置き換えられてしまうので、python側も15桁で丸めたりしたのですが、アウトプットをファイル比較プログラムで突き合わせると、同じファイルを処理しても微妙にズレがでてしまうのです。
前処理プログラム
学習時と推論時の違いは1点だけ。
処理対象のテキストファイルが複数ある一括処理か、ひとつのファイルだけを対象とする単発処理か・・だけです。
なので、例えば以下で紹介している前処理のソースを流用して、推論用のメソッドを追加して作成します。
推論用にメソッドを追加
推論用に処理するためにメソッドを追加するなら、こんな感じになります。
#ファイルをひとつだけ処理する def make_data_single(self,textfile,sOutputFile,label,nOut): #データセット用CSVを出力する部分 out_csv = open(sOutputFile,'w',newline='',encoding='utf8') out_csv_writer = csv.writer(out_csv) out_csv_writer.writerow(['x:image','y:label']) sPath = '.\\' + label + '\\' + str(nOut) + '.csv' out_csv_writer.writerow([sPath,0]) out_csv.close() #テキストファイルの内容をNNC用データに変換する部分 l_text = self.__get_input_txt(textfile) self.__make_data_csv(l_text,label,nOut)
単純に同じプライベートなメソッドを使って、単一のテキストファイルにのみ対応してますよというだけですが。
VBA側から処理を呼び出す
ファイルを受け渡して順番に処理をしていくことになりますから、当然、前の処理のアウトプットのファイルができてから、後続の処理が動かないとうまくいきません。
この辺も、VBA側で凝ったことをしようとすると、面倒くさいことになります。
ここはシンプルに以下の方針をおすすめします。
例えば
作業用フォルダが「C:\tmp2」
前処理のpythonプログラムが「data_create_single.py」という名前だとします。
その場合のバッチファイルはこんな感じになります。
cd c:\tmp2
C:\Anaconda3\python.exe data_create_single.py
nnabla_cli forward -c "C:\tmp2\net.nntxt" -p "C:\tmp2\parameters.h5" -d "C:\tmp2\nnc_dataset.csv" -o "C:\tmp2"
nnabla_cli.exeについては、こちらの記事で詳しく説明しているので、わからない方は参照してください。
バッチファイルを呼び出すVBAソース
このバッチファイルを、呼び出して終了待ちをするVBAのソースはこうですね。
Sub makedata() Dim WSH, wExecPre Dim sCmd As String '書き出したテキストをNNCで処理できるようにする Set WSH = CreateObject("WScript.Shell") WSH.Run ("""C:\tmp2\XXXXXX.bat"""), 1, True End Sub
この後続に、例えばoutput_result.csvを読み込む処理を書くとか(前回を参照してください)しておけば、バッチファイルの処理が終了してから実行してくれます。
アプリケーション部品として使うアプローチのお遊び
このポイントは、別にEXCELに限ったことではなく、NNCのモデルと学習済パラメータをアプリケーションの部品として使おうとしたときでも同じはずです。
なんですが。
残念なことに、nnabla_cli.exeを使う今回のやり方だと、起動と初期化のオーバーヘッドが大きくて遅いです。
でも、ちょっとした社内会議向けのデモくらいならやれますから、面白い使い方ではあると思ってます。
ではでは。