私が初めてSONY社のNNC(Neural Network Console)を触ったのは、ちょうど一か月ぐらい前になります。「これでディープラーニングできちゃうのー?」という驚きで、ほんとでほんとでサプライズでした。GUIベースで、機能がゴテゴテせずシンプルにまとまっており、難しそうな印象はありません。
・・・という出会いをしたのですが、折角の感動が冷めやらぬうちに、私もNNC関係の記事を書いてようかと思います。前回の『ソニー Neural Network Console と エクセルで始める ニューラルネットワーク』はNNCの紹介とディープラーニングで日経平均株価を予想する実例でしたが、今回、私はNNCの学習結果を利用し、実際にシステムに組み込む方法を紹介します。
折角だから、一番お手軽にやってみよう
NNCは、NNablaというディープラーニングのライブラリを利用しており、これをimportして使う方法が一般的ではないかと想像しています。この時点で、Python未経験者は一瞬怯んでしまったかもしれませんが、大丈夫です。今回は、PythonやAI関連技術を勉強したことない技術者でも実現可能な、最も簡単な方法でやってみます。
やり方はとても簡単です。NNCでEvaluationを実行すると、画面下部に以下のメッセージが表示されるのがわかります。
勘のいい方はお分かりだと思いますが、NNCは学習や評価の際に、Pythonのプロセスを立ち上げて処理しています。NNCではGUI操作でcli.pyキックしていますが、これを別なプログラムからプロセス起動してあげれば、ひとまず、とりあえずですが、目的は達成できてしまうのです。
cli.py forward に与える引数ですが、-c および -p は学習結果のファイルで、それぞれ net.nntxt, parmeters.h5 を指します。チュートリアルのプロジェクトでは、sample_project\tutorial 以下をたどっていくと、YYYYMMDD_HHMISS形式のディレクトリ内に生成され、学習結果やログ等が保管されているのがわかります。-d は評価対象のCSVファイルのパス、-o は結果出力先のディレクトリです。
学習結果を利用するWebアプリの作成
それでは、実際に簡単なアプリケーションから作ってみましょう。
チュートリアルとして、MNISTのデータセットを使い、与えられた画像が文字の「9」である確率を求める、というプロジェクトがあります。学習させるデータは「4」と「9」のみのごくシンプルなものです。
NNCでは、学習や評価の際は、所定のフォルダに画像とCSVファイルをあらかじめセットしておく必要があるのですが、それを動的に与えられるよう、Webアプリケーション化してみましょう。
まず、任意のディレクトリを作成し、net.nntxt, parmeters.h5 を配置します。さらに、そのディレクトリの下に推論した結果を格納するディレクトリ result を作成しておきます。
次に、WEBアプリ部分。コードはPHPで書きました。ファイルでPNG画像を選択し、「upload」を押すと、サーバ側でデータ保存およびcli.pyが実行されます。なお、画像はGrayScaleでないとエラーがでるので、NNC内に生成されたMNISTのPNG画像化データから選ぶのがよいと思われます。
推論の結果は、resultディレクトリ以下に output_result.csv ファイルが生成され、その中の y’ のカラムが「9」である確率を指しています。
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 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 |
<html lang="ja"> <head> <meta charset="utf-8"> <title>MNIST</title> </head> <body> <?php echo evaluate_png(); function evaluate_png() { $nnc_dataset = "C:/NNC/myapp/mnist"; $nnc_result = $nnc_dataset."/result"; if (!isset($_FILES['image_file']['tmp_name']) || !is_uploaded_file($_FILES['image_file']['tmp_name'])) { return 'ファイルを指定してください。'; } if (!move_uploaded_file($_FILES['image_file']['tmp_name'], $nnc_dataset.'/cfn-init_test.png')) { return 'アップロードファイルの保存に失敗ました。'; } $csv = "x:image,y:9\n".$nnc_dataset."/cfn-init_test.png,1"; file_put_contents($nnc_dataset."/image.csv", $csv); // 先に結果を消しておく @unlink($nnc_result.'/output_result.csv'); @unlink($nnc_result.'/progress.txt'); // コマンド実行 $cmd = 'C:/NNC/libs/Miniconda3/python.exe '. '"C:/NNC/libs/nnabla/python/src/nnabla/utils/cli/cli.py" forward '. '-c "C:/NNC/myapp/mnist/net.nntxt" '. '-p "C:/NNC/myapp/mnist/parameters.h5" '. '-d "'.$nnc_dataset.'/image.csv" '. '-o "'.$nnc_result.'"'; $error_occerred = ""; passthru($cmd, $error_occerred); if ($error_occerred != 0) { return 'コマンドの実行に失敗しました。'; } // 結果確認 $output = file_get_contents($nnc_result.'/output_result.csv'); if (!preg_match("/image\.png,1,(.+)/", $output, $matched)) { return '失敗しました。画像ファイルは28x28ピクセルのグレースケールになっているか確認してください。'; } return '<img src="image.png?'.uniqid().'" /> が "9" である確率は、 '.$matched[1].' です。'; } ?> <hr /> <form method="post" action="index.php" enctype="multipart/form-data"> <input type="file" name="image_file" /> <input type="submit" value="upload" /> </form> </body> </html> |
実行結果
では実行してみましょう。ブラウザで上記プログラムが配置されたURLを開きます。MNISTのpng画像化されたファイルを選択し「upload」してみます。どうでしょうか。
上の例では、アップロードされた画像が「9」である確率は、 0.113530799747 と計算されました!
チュートリアルということで、ごく簡単なプロジェクトでしたが、雰囲気は掴めたかと思います。
おわりに
今回は、NNCをインストールした環境で、できるだけ簡単にアプリケーションから呼び出してみよう、ということで、すべてローカルのWindows環境で構築しました。NNablaの実行環境さえ構築すれば、同様の方法でLinux上でも動きます。PythonやC++が苦手という方、NNCやNNablaの知識がない方でもチャレンジできるので、興味がある方はお試しください。