以前から気にはなっていたのですが、ようやく使ってみることにしました、SONYのNeural Network Console。
GUIでニューラルネットワークが組めて、簡単にディープラーニングが体験できるという優れもの。実は、Kerasなどと比べると計算速度が遅いので、あまり実用には向いていないかもしれませんが、簡単な画像認識に使ってみたり、あるいは教育用にはうってつけなツールです。
てことで、独自データで組んでみるところまでをやってみます。
まずは、以下のサイトから入手します。
Neural Network Console
「Windowsアプリで始める」をクリックすると、メールアドレスを聞かれます。そこにメアドを入れると、ダウンロードページのリンクが帰ってくるので、それに従ってダウンロードします。
すると「neural_network_console_130.zip」というのが落ちてくるので、それを解凍。
(130のところはバージョンナンバー。私が落としたのは1.3.6897.7956でした)
まずはインストール・・・ですが、方法はとっても簡単。
ZIPファイルを解凍して、出てきたフォルダを適当なところに置くだけ。デスクトップでも可。
これで、完了です。
ただし、全角文字やスペースの入ったフォルダの下にはおけません。このため、ユーザー名に全角文字を使っている人は、デスクトップは不可(絶対パスに全角文字が入るため)。また、「Program Files」もダメ。
その場合は、例えばCドライブの下に「neural_network_console_130」フォルダを作り、そこに入れるのがいいでしょう。
フォルダの中は、こうなっているはずです。「neural_network_console.exe」をダブルクリック。
最初は規約だの環境だのをいろいろと聞かれるはずです。
で、こんな感じの画面にたどり着くはずです。
真ん中には、サンプルデータがいくつか入っています。
とりあえず動かしてみたい方は、チュートリアル(チュートリアル:サンプルプロジェクトを用いた学習 – Docs - Neural Network Console)を参考に動かしてみるといいと思います。
ここでは、いきなり独自データを使います。
さて、まずは「教師データ」を準備します。
私の過去のディープラーニング用コード(TensorFlowの画像認識プログラムをKerasに書き換えてみた: EeePCの軌跡等)と似てますが、SONY Neural Network Consoleは、ラベルごとにフォルダ分けした画像データを読み込んで、教師データと評価用データとして使うようになっています。
まずは、それを準備。
私は過去に作った(TensorFlowで”日本のお城”を識別させてみた: EeePCの軌跡参照)”お城”データを使いました。
まず、私の今回のテストのフォルダ構成ですが、以下のようにしました。
【学習環境】
Neural Network Console:デスクトップ\neural_network_console_130
(パスは”C:\Users\{半角小文字のユーザー名}\Desktop\neural_network_console_130”)
【教師データ置き場と推論コードの置き場】
C:\linux\nncs\
まず、C:\linux\nncsに「data」というフォルダを作り、7種類のお城のデータを入れます。
本当は「inuyama」(犬山城)、「kumamoto」(熊本城)のように長い名前だったんですが、どういうわけか長い名前だと読みません。5文字程度に抑えた方がよさそうです。
中身はこんな感じ。
フリーソフトVIXなどを使い、全てのフォルダ内の画像サイズを64×64にしておいてください。
また、画像ファイル以外を入れないよう注意してください。
Neural Network Console側でこのデータセットを格納するフォルダをあらかじめ作ります。
私は「C:\Users\{半角小文字のユーザー名}\Desktop\neural_network_console_130」の下に「dataset_out」というフォルダを作っておきました。
これで、教師データの準備は完了。
Neural Network Consoleへ行き、左端の「DATASET」をクリックし、その近くにある「+Create Dataset」をクリックします。
こんな画面が出ます。私の環境では以下の項目を書き換えました。
・Source Dir: C:\linux\nncs\data
・Output Dir: C:\Users\{半角小文字のユーザー名}\Desktop\neural_network_console_130\dataset_out
・Output Color Ch: 3(RGB)
・Output Width: 64
・Output Height: 64
・Output file 1: の後ろのRatio(%): 90
・Output file 2: の後ろのRatio(%): 10
これで、教師データの作成が完了。学習用が90%、バリデーション用が10%に自動で割り振られるはずです。
ちなみに、DATASETの一覧に「train.csv」「test.csv」というのができるはずです。
例えば「train.csv」をクリックすると、こんな画面に。
IndexNo.と画像の横、そしてラベル名(ここでは0~6)が割り振られます。
ここでは、
0:犬山城
1:熊本城
2:松本城
3:名古屋城
4:大垣城
5:岡崎城
6:大坂城
となってました。
これ、推論の時に使うので、事前に調べておいてください。
教師データができたので、今度はニューラルネットワークを作ります。
左端の「PROJECT」をクリックし、「+New Project」をクリックします。
こんなまっさらな画面が出てくるはずです。
まずはここでこのからプロジェクトを保存しておきます。上のディスクのアイコンをクリックすると、保存できます。
私は「C:\Users\{半角小文字のユーザー名}\Desktop\neural_network_console_13」フォルダの下に「castle」という名前のフォルダを作り、「castle.sdcproj」という名前で保存しました。
ではいよいよ、ここにニューラルネットワークを作っていきます。
まずは、「IO」-「Input」をぴゅーっと引っ張ってやります。
こんな感じに、ブロックができます。
ですが、このままでは使えません。
左下にある「Layer Property」のSizeのところを「1,28,28」を「3,64,64」に変えてやります。
これでRGBの64×64の画像が読めるようになります。
続いて、下の方にある「Basic」-「Convolution」を、さきほどのInputにぶつけるようにドラッグ&ドロップします。
ただし、こいつもデフォルトでは使えません。Layer Propertyをいじります。
私はKernelShapeを「5,5」から「3,3」に、Paddingを「0,0」から「1,1」に変えます。
もしPaddingを「0,0」のままにすると、Convolution層を通るたびに画像サイズが上下左右1ドットづつ小さくなっていきます。これを防ぐために、Paddingに入れた分だけ補正して増やしてやる必要があります。
もしKernelShapeを「5,5」のままにするならば、Paddingを「2,2」とすると画像サイズが小さくならずに済みます。
続いて、「Activation」の「ReLU」をドラッグ&ドロップします。
が、左のメニューからこの「ReLU」が探せなくなっているはず。
どういうわけかこの左メニューはホイールマウスのスクロール機能が効きません。頑張ってマウスでニューラルネットワークの部品の並んだ窓の端にあるバーをつまんで、動かすしかありません。
ReLUはデフォルトのままでいいです。
同様に、「Pooling」-「MaxPooling」をつけます。
で、この後、第2層目、第3層目のConvolution - ReLU - MaxPoolingのセットを作ります。
だたし、
【2つ目のConvolutionのLayer Property】
・OutMaps : 「32」
・KernelShape:「3,3」
・Padding:「1,1」
【3つ目のConvolutionのLayer Property】
・OutMaps : 「64」
・KernelShape:「3,3」
・Padding:「1,1」
としてください。
その下に、「Basic」-「Affine」をつけます。
Layer Propertyの「OutShape」を512としてください。
その下にReLUを付けた後、左の部品メニューのずーっと下にある「Other」-「Dropout」を引っ付けてください。なくてもいいですが、過学習を防ぐため、あったほうが無難です。
最後に、Affine(Layer PropertyのOutShapeをラベル数に、ここでは「7」)、「Activation」-「Softmax」をつけて、最後に「Loss」-「CategoricalCrossEntropy」というのを引っ付けてください。
これで、完了です。
さて、ここで教師データを選んでやります。
画面の赤丸のある辺りにある「DATASET」をクリックします。
分かりにくい図で申し訳ありませんが、まず左の「Training」を選び、右の斜め上矢印と四角のアイコンをクリックし、そこで現れる一覧から「train.csv」を選びます。
同様に、「Validation」では「test.csv」を選択します。
続いて、画面右上のある「CONFIG」をクリックして、以下のような画面を出します。
ここでは、Max Epoch:を50に、Batch Size:を20、Precision:をHalfとしておきました。
ここでようやく学習開始です。「Training」の下の再生ボタンっぽいのを押しましょう。
こんな感じに、なんか学習が進みます。正常なら、エラー率がどんどん減っていくはずです。
終わったら、横の「Evaluation」の再生ボタンを押してみましょう。
評価用の画像と、その推測ラベルが表示されます。
「Confusion Matrix」というラジオボタンを押すと、各ラベルと全体の正答率が出てきます。
なんと、Accuracyが「1.0」でした!全問正解!たまたまでしょうが、すごい正答率ですね。
さて、今度はこれを使って「推論コード」を作ります。
ここまではノンプログラミングでしたが、推論に関してはそれを使って何かをさせる必要があるため(不良品を見つけて機械を止めるとか、画像を見て機械に仕分けさせるとか)、Pythonのコードに持っていくのがベターかと思われます。
そこで、今回学習させた学習器を使って推論をさせるPythonプログラムの最低限の作り方を書きます。
その前に、まずはWindows上でAnaconda3を使えるようにしておいてください。
SONY Neural Network Consoleで作ったニューラルネットワークとモデルを使うための最低限の準備は、以下の記事を参照。
NNabla(Neural Network Libraries)をWindowsのanaconda(python3)環境にインストール - "BOKU"のITな日常
この記事に加えて、ここではOpenCVを使うため
> pip install opencv-python
も入れておいてください。
ここで設定したAnacondaプロンプトが使えることを前提として、進めます。
まず、先ほど学習の終わったNeural Network Consoleで、左上の「EDIT」をクリックします。
そこでまず一番下のブロック「CategoricalCrossEntropy」を消します。
そのうえで右クリックすると、上のようなメニューが出るので、「Export」-「Python Code」を選択します。
クリップボードにコードが張り付けられた旨が表示されるため、適当なテキストエディタに張り付けてください。
(ここでは、VS Codeに張り付け)
こんな感じに、コードが張り付きます。
その下に、以下のコードを張り付けてください。
import cv2
# load parameters
nn.load_parameters('モデルのパス')
# Prepare input variable
x=nn.Variable((1,3,64,64))
IMAGE_SIZE = 64
im = cv2.imread('推論させたい画像ファイル名')
im = cv2.resize(im, (IMAGE_SIZE,IMAGE_SIZE)).transpose(2,0,1)
x = nn.Variable((1, ) + im.shape)
x.d = im.reshape(x.shape)
# Build network for inference
y = network(x, test=True)
# Execute inference
y.forward()
print(y.d)
赤字の部分を2箇所変えます。
「モデルのパス」のところですが、SONY Neural Network Consoleのプロジェクトを保存したフォルダに「(プロジェクト名).files」というのがあって、その下に日付っぽいフォルダがあり、その下に学習済みモデルが入っています。
こんな感じのファイルがあるはずです。
この中の「results.nnp」というのが、学習済みモデルです。
このパスを上の「モデルのパス」のところに記載してもいいですし、Pythonプログラムと同じ場所において「./results.nnp」としてもいいです。
画像は
これを「test_app.py」と保存します。
これを実行
> python test_app.py
すると、以下のような結果が。
うーん、分かりにくいですよね。
最後に出てくる”[[1. 0. 0. 0. 0. 0. 0.]]”というのが推論結果なんですが・・・
これは、要するに0~7のラベルの内、この画像はラベル0だ!と言っているんです。
ちなみに、推論させた画像はこれ。
ちなみに、事前に調べておいたラベルによれば・・・
0:犬山城
1:熊本城
2:松本城
3:名古屋城
4:大垣城
5:岡崎城
6:大坂城
だったので、ラベル0 = 犬山城 ということになります。
つまり、正解!
他にも
を入れてみると
ラベル2ということだから・・・松本城!正解です!
という具合に、まあまあの学習モデルができて、しかもPython上で動かすところまで行けました。
サンプルも充実しているので、このNeural Network Console、結構使えそうです。
最近のコメント