アラカン"BOKU"のITな日常

文系システムエンジニアの”BOKU”が勉強したこと、経験したこと、日々思うことを書いてます。

EXCELとNeural Network Consoleを連携する時の「ちょっとしたポイント」/使い方39

前回、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

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

普通に考えれば、同じロジックを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のソースはこうですね。

    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のモデルと学習済パラメータをアプリケーションの部品として使おうとしたときでも同じはずです。

なんですが。

残念なことに、今のNNCはそういう再利用しやすくする部分が、ちょっと弱い感じ<あくまで個人的な感想です(笑)>で、nnabla_cli.exeも、毎回起動と初期化のオーバーヘッドが大きくて、こういう使い方ではとても遅いです。

正直、現場で実際の業務に適用しようと思ったら、Neural Network Librariesとか使って、ゴリゴリ書く前提になるでしょうね。

しかし。

しかしです。

こういう使い方には、とても可能性はあると自分は思ってます。

もし、nnabla_cliがサービス化してオーバーヘッドが解消されて、各言語からAPI呼出しできるようにとかなったら。

凄いですよ・・これは。

だって。

アプリケーションの部品としてAIが簡単に使えるようになるわけですから。

ちょっとしたイノベーションがおこせるかもしれません。

なんてね。

そんな、妄想をいだきつつ・・今日もお遊びをしているわけです。

ではでは。