NNC(NeuralNetworkConsole)で学習させたパラメータを用いて推論してみた(Python・NNabla使用)

 

SONYが出してるNNC(ニューラルネットワーク コンソール)を使って簡単に今流行りのディープラーニングが体感できることはわかった。

けれども、NNCだけだとどうやら不十分らしい。ただ画像を学習してそれを評価することしか出来ません。いやこれでも個人的にはすごいと思ってしまうけれども・・・。
とにかく、NNCだけでは世の中に出ているようなロボットが画像を認識するとか、株価の予測とか、そう言ったニューラルネットワーク を応用した開発は出来ないみたいです。

そこで、NNCが利用しているライブラリであるNNabla(ニューラルネットワーク ライブラリ)というものを使ってコードを書くということが必要になってくる。

今回はプログラムの基礎はある程度知っているけれど、ライブラリを利用してプログラムを作ったりしたことが全くほとんどない素人プログラマが、NNCが作ってくれたNNを利用してMNIST0~9の文字認識を行ってみました。(ほとんどのコードもネットから引っ張ってきてます)
もしかしたら全然違うことをやってるかもしれないですが、勉強メモとして残したいのでまとめてみました。(言い訳)

前提として、MacWindowsにすでにNNCとNNablaが入ってることにします(導入とか、書くのがめんどくさかった・・・)

参考サイトは次の通りです。とてもわかりやすいので絶対にそちらをみながらやった方がいいと思います。
NNabla(Neural Network Libraries)で学習済のパラメータのSAVEとLOADをやってみる。 - アラカン"BOKU"のITな日常
ライブラリーを使わずにPythonでニューラルネットワークを構築してみる - Qiita

 

公式リファレンス
Neural Network Libraries — Neural Network Libraries 0.9.9 documentation

あと参考書として以下のものを利用しました

ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装

ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装

 

 

NNablaとは?
そもそもNNablaとはなんなのか
SONYが開発した、ニューラルネットワーク をかなり短めなコードだけで簡単に記述することができる便利なライブラリのこと。
他にはGoogleが出してるTensorFlowだったり、PrefferedNetworkが開発したChainerがあります。NNablaはSONYが出したもの。

NNabla以外は名前ぐらいしかわからないです()

特徴は公式サイトに書いてあるのでそちらを参考に。
nnabla.org

NNablaはC++Pythonが利用できるみたいです。今勉強中なのはPythonなのでPythonでやっていきます。

自分の開発環境?(適当)
・Python3.6が入ってるMac
・ターミナルで実行してる
・NNCを実行したのはWindowsのゲーミングパソコン
(性能低いとNNCの学習から評価までものすごく時間がかかる)

 

必要なこと、もの
・データセットの準備・読み込みする部分のコードの記述
・ネットワークの構築
・パラメータ作成

・推論部分の構築

とりあえずこの4つを作ることができればできるっぽい。
この中の青字はNNC側は作ってくれるので、実際に頑張るのはデータセットの準備とか推論部分の構築ぐらい。

1.NNCでCNNを構築してMNISTを学習させる
チュートリアルの「02_binary_cnn」で学習させます。これに関してはいろんなサイトで既に書かれていたりするので下にネットワークの画像を載せつつここでは割愛します。

f:id:gen-193:20180501084055p:plain

2.データセットの準備・読み込みする部分のコードの記述
NNCで学習させたデータセットCSVファイルを呼び出すためのコードを記述します。

まずはインポート部分。

#import部分
#データの読み込みで使用する
from args import get_args
from data_iterator import data_iterator_csv_dataset
import nnabla.solvers as S
from cnn_network import network
#ネットワーク構築で使用している
import nnabla as nn
import nnabla.functions as F
import nnabla.parametric_functions as PF

#データ読み込み
test_data = data_iterator_csv_dataset("mnist_test.csvが入っているパスを記述",1,shuffle=False)

以下のサイトから必要なファイルをダウンロードします
https://github.com/sony/nnabla/tree/master/python/src/nnabla/utils

ってまあこれがわかったのは以下のサイトのおかげです。助かりました。ほとんどこちらを参考にしちゃっていいと思います。
cedro3.com

データセットなんですが、NNCがCSVファイルとしてまとめてくれています。
neural_network_console_110/samples/sample_dataset/MNIST/mnist_test.csv

ここまででデータセットの読み込みの準備は完了です。

3.ネットワークの構築
最初にMNISTの学習をさせたネットワークをPythonのコードにします。

EDITの画面の中で右クリックしてExportを選択。「Python Code(NNabla)」を選択するとクリップボードにコピーされます。
新しいpythonファイルを作成して、何でもいいので名前をつけます。とりあえず「cnn_network」とでも名付けます。

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

def network(x, y, test=False):
    # Input -> 1,32,32
    # Convolution -> 16,28,28
    with nn.parameter_scope('Convolution'):
        h = PF.convolution(x, 16, (5,5), (0,0))
    # MaxPooling -> 16,14,14
    h = F.max_pooling(h, (2,2), (2,2), True)
    # Tanh
    h = F.tanh(h)
    # Convolution_2 -> 8,10,10
    with nn.parameter_scope('Convolution_2'):
        h = PF.convolution(h, 8, (5,5), (0,0))
    # MaxPooling_2 -> 8,5,5
    h = F.max_pooling(h, (2,2), (2,2), True)
    # Tanh_2
    h = F.tanh(h)
    # Affine -> 73
    with nn.parameter_scope('Affine'):
        h = PF.affine(h, (73,))
    # Tanh_3
    h = F.tanh(h)
    # Softmax
    h = F.softmax(h)
    # CategoricalCrossEntropy -> 1
    #h = F.categorical_cross_entropy(h, y)
    return h

貼り付けるとこんな感じのファイルになってるはずです。楽チンですね・・・。
よく見てみるとちゃんとnnablaのライブラリを使用してネットワークが書かれているのがわかると思います。
Convolutionが2つ、MaxPoolingも2つあるし、きちんとEDITで作成したネットワークと同様になってれば大丈夫です。

ネットワークの構築もこれで終わり。

4.パラメータの作成と推論の記述
作成といっても実は既に作成されています()1の段階でNNCで学習させたネットワークのパラメータを使えば終わりです。
neural_network_console_110/samples/sample_project/tutorial/basics/02_binary_cnn.files/学習させた日付/parameters.h5

この「parameters.h5」というファイルが多分学習パラメータが入ってるファイルなんだと思います(詳しくはわかってない)
このファイルを見つけたらファイルパス名はコピーしておきましょう
以下の記述を行います。

mch = 0 #初期化
nn.clear_parameters() #パラメータの初期化?必ずネットワーク構築前に記述
x=nn.Variable((1,1,28,28)) #バッチサイズ,size1、28*28
t=nn.Variable((1,1))
y = network(x,t)
#学習済みのパラメータ取得
nn.parameter.load_parameters("Parameters/h5があるパス名を記述");
#推論(一件ずつデータを検証し、カウントする)
for i in range(test_data.size):
    x.d, t.d = test_data.next()
    y.forward()
    if t.d == y.d.argmax(axis=1) :
        mch += 1

print("Accuracy:{}".format(mch / test_data.size))


5.実行
ということで実行して見ます。

f:id:gen-193:20180501102417p:plain

といっても実行するだけなので書くことないですね・・・とりあえず実行はできてるっぽいです。
まあこれだけだとあんまり出来てるのか実感が湧かないのでそのうち自分で書いた数字を認識させて見たいですね。

参考サイト
http://nnabla.readthedocs.io/en/latest/
NNablaでニューラルネットワークコンソールで学習済のパラメータを利用して推論のみを行う。 - アラカン"BOKU"のITな日常
http://cedro3.com/ai/nnabla-original-dataset/