SE_BOKUのまとめノート的ブログ

SE_BOKUが知ってること・勉強したこと・考えたことetc

EXCELとNeural Network Consoleを連携してデモを動かすポイント/Neural Network Console

EXCELとNeural Network Console(ニューラルネットワークコンソール:以後NNC)を連携させて簡単なデモンストレーションを動かす例をやります。

f:id:arakan_no_boku:20190326212937j:plain

 

前提のお話

EXCELとNeural Network Console(ニューラルネットワークコンソール:以後NNC)を連携させて、定義モデルと学習済パラメータを使って推論をやってみました。

arakan-pgm-ai.hatenablog.com

 

でも、前回のパターンだと、単に推論する対象データ(画像)を他で用意して、処理(NNabla_cli.exe)をEXCELから呼び出しているにすぎません。

arakan-pgm-ai.hatenablog.com

やっぱり、EXCELのセルに入力した文章とかをデータとして渡して、推論を実行するパターンもやっとかないと片手落ちっぽいので、ちょっと試してみます。

 

EXCELとNNCを連携するデモの処理フロー

結論を先に書いてしまうと、以下の順序にしないとうまくいきませんでした。

  1. EXCELのセルの内容をUTF-8でテキストファイルに保存する
  2. 保存したファイルをPythonで読み込み、NNC用データとデータセットCSVを生成する
  3. NNC用データをファイルで保存後、NNabla_cli.exeを起動する

全体の流れを図にするとこんな感じです。

f:id:arakan_no_boku:20180723234917j:plain

 

連携のポイントはデータはpythonだけで作ること

特に「NNC用データ作成(前処理)」は、学習時のデータ作成に使ったのと同じものを使わないといけない・・というのはポイントです。

つまり。

データ作成はすべてpythonに統一するということです。

 

普通に考えれば、同じロジックをVBA側に実装して、いきなりNNC用データをEXCEL VBAで作ったらいいじゃないかとなりますが、それではうまくいきません。

 

実際、自分もやってみたのですが。

同じロジックでやっても、VBApythonでは同じデータができませんでした。

そもそも、小数点以下の精度(桁数)が違います。

 

VBAは小数点以下15桁目以降は0に置き換えられてしまうので、python側も15桁で丸めたりしたのですが、アウトプットをファイル比較プログラムで突き合わせると、同じファイルを処理しても微妙にズレがでてしまうのです。

 

前処理プログラム

学習時と推論時の違いは1点だけ。

処理対象のテキストファイルが複数ある一括処理か、ひとつのファイルだけを対象とする単発処理か・・だけです。

なので、例えば以下で紹介している前処理のソースを流用して、推論用のメソッドを追加して作成します。

arakan-pgm-ai.hatenablog.com

 

推論用にメソッドを追加

推論用に処理するためにメソッドを追加するなら、こんな感じになります。

    #ファイルをひとつだけ処理する
    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側で凝ったことをしようとすると、面倒くさいことになります。

ここはシンプルに以下の方針をおすすめします。

  1. 前処理と推論処理をBATファイルにまとめる。
  2. 上記のバッチファイルをVBA側から実行する
  3. 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については、こちらの記事で詳しく説明しているので、わからない方は参照してください。

arakan-pgm-ai.hatenablog.com

 

バッチファイルを呼び出す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を使う今回のやり方だと、起動と初期化のオーバーヘッドが大きくて遅いです。

でも、ちょっとした社内会議向けのデモくらいならやれますから、面白い使い方ではあると思ってます。

ではでは。