チュートリアル:Neural Network Consoleによる学習済みニューラルネットワークのNeural Network Librariesを用いた利用方法2種

Wednesday, May 02, 2018

App , Cloud

Posted by Yoshiyuki Kobayashi

Neural Network Consoleで学習したニューラルネットワークは、(Neural Network Consoleは用いることなく)オープンソースのNeural Network Librariesのみを用いての推論実行が可能です。本チュートリアルでは、Neural Network Consoleで学習したニューラルネットワークについて、Neural Network Librariesのコマンドラインインターフェイスを用いて推論を実行する方法と、Python APIを用いて推論を実行する方法の2つについて解説します。

 

1. コマンドラインインターフェイスを用いて推論を実行する方法

コマンドラインインターフェイスを用いた推論は、一切のコーディングを行うことなく、最も簡単に推論を実行させることができます。一方で、毎回Pythonを起動し、学習済みネットワークの構造やパラメータ、認識対象のデータセットの読み込みを行うため、実行速度が遅いという欠点があります。

コマンドラインインターフェイスは、それほどパフォーマンスを重視しないケースや、実験的に推論を実行させたい用途に向いています。

1.1 学習済みニューラルネットワークを取得する

まずは、Neural Network Consoleを用いて学習したニューラルネットワークを準備します。

Neural Network Console クラウド版を用いて学習した場合は、TRAININGもしくはEVALUATIONタブ左の学習結果リストのうち、取得したい学習結果を右クリックして表示されるポップアップメニューからDownloadを選択します。ニューラルネットワークの構造と、学習されたパラメータを含むresult.nnpファイルを取得することができます。



Cloud版から学習済みニューラルネットワークを取得

Neural Network Console Windows版を用いて学習した場合は、TRAININGもしくはEVALUATIONタブ左の学習結果リストのうち、取得したい学習結果をダブルクリックするか、右クリックして表示されるポップアップメニューから「Open Result Location」を選択します。

学習結果の保存されているフォルダが開き、以下の2つのファイルを見つけることができると思います。

ファイル名 解説
net.nntxt ニューラルネットワークの構造
results.nnp ニューラルネットワークの構造とパラメータ

Windows版の学習済みニューラルネットワークを構成するファイル

1.2 Neural Network Librariesが利用可能な環境を準備する

任意のPC(Neural Network Consoleがインストールされている必要はない)にNeural Network Librariesをインストールします。Neural Network Librariesのインストールについては、以下のドキュメントをご参照ください。

http://nnabla.readthedocs.io/en/latest/python/installation.html

インストールが完了したら、Neural Network Librariesのパッケージに含まれる以下のCLIコマンドをPythonから実行します。

$ python {Neural Network Libraries Installation Path}/nnabla/utils/cli/cli.py forward
2017-xx-xx xx:xx:xx,xxx [nnabla][INFO]: Initializing CPU extension...
usage: cli.py forward [-h] -c CONFIG [-p PARAM] [-d DATASET] -o OUTDIR
cli.py forward: error: the following arguments are required: -c/--config, -o/--outdir

以上のような表示が出たら、CLIを利用する準備は完了です。

Windows版Neural Network Consoleをご利用の場合、同梱のPython環境がそのまま利用可能です。

セットアップ画面、ENGINEタブのEnvironment Variableの設定に従い環境変数を設定します。具体的にはコマンドプロンプトを開き、以下の2つのコマンドを入力します。{Neural Network Console Installation Path} はNeural Network Consoleをインストールしたパスに置換して使用します。

SET PYTHONPATH={Neural Network Console Installation Path}\libs\nnabla\python\src
SET PATH={Neural Network Console Installation Path}\libs\nnabla\python\src\nnabla;{Neural Network Console Installation Path}\libs\Miniconda3; {Neural Network Console Installation Path}\libs\Miniconda3\Scripts

以下のようにPythonを実行し、Neural Network Librariesがimportできることをご確認ください。

> python
Python 3.6.1 |Continuum Analytics, Inc.| (default, May 11 2017, 13:25:24) [MSC v.1900 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import nnabla
2017-xx-xx xx:xx:xx,xxx [nnabla][INFO]: Initializing CPU extension...
>>>

さらに、Neural Network Console同梱のNeural Network Librariesのパッケージに含まれる以下のCLIコマンドをPythonから実行します。

> python {Neural Network Console Installation Path}\libs\nnabla\python\src\nnabla\utils\cli\cli.py forward
2017-xx-xx xx:xx:xx,xxx [nnabla][INFO]: Initializing CPU extension...
usage: cli.py forward [-h] -c CONFIG [-p PARAM] [-d DATASET] -o OUTDIR
cli.py forward: error: the following arguments are required: -c/--config, -o/--outdir</td>

以上のような表示が出たら、Windows版Neural Network Console 同梱のNeural Network Libraries を用いてCLIを利用する準備は完了です。

1.3 コマンドラインインターフェイスを用いて推論を実行する

推論は、Neural Network LibrariesのCLIを以下の引数で呼び出すことで実行できます。

python {CLI Path}/cli.py forward
-c Network configulation file (result.nnp)
-d Dataset CSV file of input data
-o Inference result output folder</td>

cli.pyに続くforwardは、推論の実行を指定するものです。

-cオプションを用いて、ネットワーク構造(results.nnpファイル)を指定します。

-dオプションを用いて、推論対象のデータセットCSVのファイル名を指定します。ここで指定するデータセットCSVファイルのフォーマットは、Neural Network Consoleで用いるものと同じです。-dオプションで指定する推論対象のデータセットCSVファイルには、推論に用いる入力データのみが含まれていればOKです(例えば画像xからラベルyを推定するニューラルネットワークの場合、ラベルyが含まれている必要はありません)。とりあえずの動作確認のためには、Validationデータセットを用いることができます。

-oオプションを用いて、出力フォルダを指定します。-dオプションで指定したデータセットCSVファイルに対する推論の実行結果は、-oオプションで指定したフォルダに「result.csv」ファイルとして保存されます。

以下は、01_logistic_regressionサンプルプロジェクトの学習結果について、c:\neural_network_console\にインストールしたNeural Network Console同梱のNeural Network Librariesを用い、コマンドラインインターフェイスから推論実行した例です。出力フォルダに指定しているc:\tmpフォルダは予め作成しておく必要があります。

> python C:\neural_network_console\libs\nnabla\python\src\nnabla\utils\cli\cli.py forward -c C:\neural_network_console\samples\sample_project\tutorial\basics\01_logistic_regression.files\20171021_151530\results.nnp -d C:\neural_network_console\samples\sample_dataset\MNIST\small_mnist_4or9_test.csv -o C:\tmp\
2017-xx-xx xx:xx:xx,xxx [nnabla][INFO]: Initializing CPU extension...
...
2017-xx-xx xx:xx:xx,xxx [nnabla] [Level 99]: data 64 / 500
2017-xx-xx xx:xx:xx,xxx [nnabla] [Level 99]: data 128 / 500
2017-xx-xx xx:xx:xx,xxx [nnabla] [Level 99]: data 192 / 500
2017-xx-xx xx:xx:xx,xxx [nnabla] [Level 99]: data 256 / 500
2017-xx-xx xx:xx:xx,xxx [nnabla] [Level 99]: data 320 / 500
2017-xx-xx xx:xx:xx,xxx [nnabla] [Level 99]: data 384 / 500
2017-xx-xx xx:xx:xx,xxx [nnabla] [Level 99]: data 448 / 500
2017-xx-xx xx:xx:xx,xxx [nnabla] [Level 99]: data 500 / 500
2017-xx-xx xx:xx:xx,xxx [nnabla] [Level 99]: Forward Completed.</td>

GPUを用いて学習したものをCPUのみ利用可能な環境で推論実行しようとすると、GPUが利用できないことが原因のエラーが発生します。このような場合は、net.nntxtをテキストエディタで開き、冒頭のglobal_configを以下のように編集することで実行可能になります。

global_config {
  default_context {
    backend: "cpu"
    array_class: "CpuCachedArray"
  }
}

Cloud版Neural Network Consoleの場合、result.nnpファイルの拡張子をzipに変更して解凍し、result.nnpに含まれる.nntxtファイルに対して同様の編集を行い、再びzipで圧縮して利用します。

 

2. Python APIを用いて推論を実行する方法

Python APIを用いた推論は、Neural Network Librariesを用いた最も標準的な推論の実行方法です。Neural Network Librariesの豊富な機能を直接利用することができ、外部のプログラムとの連携の容易さや、パフォーマンスにも優れています。

2.1 学習済みニューラルネットワークの取得と、Neural Network Librariesが利用可能な環境の準備

コマンドラインインターフェイスを用いて推論を実行する方法で紹介した方法と同様にして、学習済みニューラルネットワークの取得と、Neural Network Librariesが利用可能な環境の準備を行います。

2.2 推論を実行するネットワークのPythonコードを取得する

Windows版Neural Network Consoleで、推論を実行したいネットワークのプロジェクトを開きます。今回は、例として02_binary_cnn.sdcprojを利用します。



02_binary_cnn.sdcprojサンプルプロジェクト

学習に用いたニューラルネットワークを編集して、推論用のニューラルネットワークを作成します。今回の02_binary_cnnの場合、推論時にはロスを求めるレイヤーは不要ですので、ネットワーク最後のBinaryCrossEntropyレイヤーを削除します。

推論用のニューラルネットワークが設計出来たら、ネットワークを右クリックして表示されるポップアップメニューから、Export、Python Code (NNabla)を選択します。



ロスレイヤーを削除し、Export、Python Code (NNabla)を選択

クリップボードにNeural Network Librariesを用いて編集中のネットワークを定義するためのコードがコピーされます。

import nnabla as nn
import nnabla.functions as F
import nnabla.parametric_functions as PF

def network(x, test=False):
  # Input -> 1,28,28
  # Convolution -> 16,24,24
  with nn.parameter_scope('Convolution'):
    h = PF.convolution(x, 16, (5,5), (0,0))
  # MaxPooling -> 16,12,12
  h = F.max_pooling(h, (2,2), (2,2), True)
  # Tanh
  h = F.tanh(h)
  # Convolution_2 -> 8,8,8
  with nn.parameter_scope('Convolution_2'):
    h = PF.convolution(h, 8, (5,5), (0,0))
  # MaxPooling_2 -> 8,4,4
  h = F.max_pooling(h, (2,2), (2,2), True)
  # Tanh_2
  h = F.tanh(h)
  # Affine -> 10
  with nn.parameter_scope('Affine'):
    h = PF.affine(h, (10,))
  # Tanh_3
  h = F.tanh(h)
  # Affine_2 -> 1
  with nn.parameter_scope('Affine_2'):
    h = PF.affine(h, (1,))
  # Sigmoid
  h = F.sigmoid(h)
  return h

2.3 推論に必要なコードを追加する

ネットワークを定義するコードに対し、推論のために必要なコードを追加していきます。

# load parameters
nn.load_parameters(‘{training result path}/results.nnp’)

# Prepare input variable
x=nn.Variable((1,1,28,28))

# Let input data to x.d
# x.d = ...
x.data.zero()

# Build network for inference
y = network(x, test=True)

# Execute inference
y.forward()
print(y.d)

まずnn.load_parametersで、学習結果のパラメータファイルを読み込みます。引数にはresults.nnpファイルのパスを指定します。

次に、データ入力のための変数を用意します。用意すべき変数のサイズは、同時に推論を行う画像枚数+データのサイズとします。今回、1枚ごとに推論を行い、02_binary_cnnでは入力データとしてサイズ1,28,28の画像を扱っていましたので、(1,1,28,28)サイズの変数xを用意します。

続いて、作成したNeural Network Librariesの変数xにデータを入力します。Neural Network Librariesの変数は、「.d」を用いることで、NumPyのArrayとして扱うことができます。ここではひとまず動作を確認するため、x.data.zero()として、xの内容をゼロで埋める処理を行っています。

次のコードは、Neural Network ConsoleからExportしたPythonコードを用い、xを入力とし、yを求めるネットワークを構築しています。引数のtest=Trueは、推論実行用のネットワークを用いることを指定しています。

最後に、y.forward()を実行して推論のための前方計算を実行します。推論結果は変数yに格納されているため、y.dを参照することで推論結果を取得することができます。

2.4 作成した推論用コードを、Pythonから実行する

以下に、上記Pythonコードをtest.pyとして保存し、実行した結果を示します。

> python test.py
2017-xx-xx xx:xx:xx,xxx [nnabla][INFO]: Initializing CPU extension...
[[ 0.10899857]]

x.data.zero()とした入力xに対する認識結果0.1089…が出力されていることが分かります。より詳しいNeural Network Libraries Python APIのチュートリアルについては以下をご参照ください。

http://nnabla.readthedocs.io/en/latest/python/tutorial.html

2.5 Pythonから推論用コードを実行するにあたっての注意点

x.dに画像データを入力する場合、画像の正規化が必要な場合があります。Neural Network Consoleで学習を行った際、DATASETタブのImage Normalization (1.0/255.0)にチェックしていた場合は、ファイルから読み込んだ各ピクセルの輝度値0~255を255.0で割り、0.0~1.0の値に加工したうえでx.dに代入するようにします。

カラー画像を扱う場合、Pythonのscipy.misc.imread等で読み込んだ画像は(Height, Width, 3)サイズになっていますが、x.dに代入する際は、numpy.transposeなどを使い(3, Height, Width)の順にする必要があります。具体的には、以下のようにしてテンソルの次元の順序を入れ替えます。

from scipy.misc import imread
im = scipy.misc.imread(ファイル名).transpose(2, 0, 1)
x=nn.Variable((1, ) + im.shape)
x.d = im.reshape(x.shape)