【Neural Network Console】学習データの出力方法

Neural Network Consoleは、触っているとすぐに結果がわかる(小さいニューラルネットワークだと。。)ので、楽しいのですが、それもだんだん飽きてきたので、処理の中身を勉強しなきゃ!と思いつつも、Neural Network Consoleで学習させたデータをNeural Network Libraryを使ってプログラムに処理を組み込む方を先に検討しようかと思っています...

まず、作成したニューラルネットワーク構造を保存するには、どこでもいいので、レイヤーの部分を右クリックします。

 

すると、Exportの部分があるので、Exportを選択すると、

・prototxt(Caffe用のファイル?)

・Python Code

が表示されているので、どちらかを選択します。

 

prototxtを選択すると、名前を付けて保存ダイアログが表示されるので、ファイルに保存すると、こんな感じ↓の内容のファイルが作成されます。

layer {
  name: "Input"
  type: "Data"
  top: "Input"
}
layer {
  name: "Convolution"
  type: "Convolution"
  convolution_param {
    num_output: 16
    kernel_size: 5
    dilation: 1
  }
  bottom: "Input"
  top: "Convolution"
}
layer {
  name: "MaxPooling"
  type: "Pooling"
  pooling_param {
    pool: MAX
    kernel_size: 2
    stride: 2
  }
  bottom: "Convolution"
  top: "MaxPooling"
}
layer {
  name: "Tanh"
  type: "TanH"
  bottom: "MaxPooling"
  top: "Tanh"
}
layer {
  name: "Convolution_2"
  type: "Convolution"
  convolution_param {
    num_output: 8
    kernel_size: 5
    dilation: 1
  }
  bottom: "Tanh"
  top: "Convolution_2"
}
layer {
  name: "MaxPooling_2"
  type: "Pooling"
  pooling_param {
    pool: MAX
    kernel_size: 2
    stride: 2
  }
  bottom: "Convolution_2"
  top: "MaxPooling_2"
}
layer {
  name: "Tanh_2"
  type: "TanH"
  bottom: "MaxPooling_2"
  top: "Tanh_2"
}
layer {
  name: "Affine"
  type: "InnerProduct"
  inner_product_param {
    num_output: 10
  }
  bottom: "Tanh_2"
  top: "Affine"
}
layer {
  name: "Tanh_3"
  type: "TanH"
  bottom: "Affine"
  top: "Tanh_3"
}
layer {
  name: "Affine_2"
  type: "InnerProduct"
  inner_product_param {
    num_output: 1
  }
  bottom: "Tanh_3"
  top: "Affine_2"
}
layer {
  name: "Sigmoid"
  type: "Sigmoid"
  bottom: "Affine_2"
  top: "Sigmoid"
}

 

Python Codeを選択すると、こちらはファイルではなく、クリップボードにコピーされます。

def network(x, y, test=False):
  # Input -> 1,28,28
  # Convolution -> 16,24,24
  with 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 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 parameter_scope('Affine'):
    h = PF.affine(h, (10,))
  # Tanh_3
  h = F.tanh(h)
  # Affine_2 -> 1
  with parameter_scope('Affine_2'):
    h = PF.affine(h, (1,))
  # Sigmoid
  h = F.sigmoid(h)
  # BinaryCrossEntropy
  h = F.binary_cross_entropy(h, y)
  return 

 

ただ、一番知りたかったのは、学習データそのものなのですが、こちらは学習の画面(TRAINING)の左側に表示されている学習のログの部分を右クリック→Open Result Location もしくは ダブルクリックで学習データが保存されているフォルダが表示されます。

 

 

学習データの保存フォルダ↓

 

このフォルダには各種ログファイルと、重みやバイアスの値が格納されているファイル(*.h5)が保存されています。

 

この*.h5ファイルは、個人的には全く馴染みの無いファイルだったのですが、このファイルのビューアソフトは、こちらのページ↓

 

https://www.hdfgroup.org/downloads/hdfview/

 

よりダウンロードすることができます。

ただし、初めての場合はメールを登録しないとダウンロードできません。

メールを登録後、メールが来るのですが、私の場合は迷惑メールフォルダに振り分けられていたので、しばらくしてもメールが来ない場合は、迷惑メールフォルダも確認するとよいと思います。

 

私の場合はWindows10 64bitなので、 HDFView – Windows のファイルをダウンロードしました。

ファイル(HDFView-3.0-win7_64.zip)をダウンロード後、解凍するとセットアップファイル(HDFView-3.0.msi)があるので、このファイルをダブルクリックして実行します。

 

あとは表示に従って次へ次へ進めていけば、インストールができます。

 

最後に Launch HDFVie-3.0.0 の部分にチェックを入れ、Finishボタンをクリックすると、ビューアのプログラムが起動します。

 

これで、先ほどの学習データの保存フォルダに格納されているh5ファイルを開こうとしたら、なぜか?失敗。。。

試しに 01_logostic_regressionのファイルを開いたら開けたので、再度、 02_binary_cnn 作成されたh5ファイルを開いたら、今度は成功!

 

そして、こちら↓がファイルを開いた画面

 

重みっぽいのがいる~!

 

試しに最初のaffineWの部分をダブルクリックすると、その部分の重みがExcelのような画面で表示されます。

 

このパラメータはこの↓ニューラルネットの最初の Affine の部分の重みで

 

 

入力が8 x 4 x 4 = 128個で出力が10個になっているので、確かにつじつまも合う!

 

このパラメータが分かってしまえば、層の浅いニューラルネットワークであれば、単純に画像のフィルタ処理のノリでプログラムに落とし込めそう!!

 

とはいっても、次は、出力されたニューラルネットワークと、このh5ファイルを使って、プログラム(できればC++)に落とし込む方法を調べてみようと思っています。

(詳しい方がいれば、参考になるページ等、教えて下さい!)

【Neural Network Console】新規画像のDataset作成方法

Deep Learning用の学習データとしては、MNISTの手書きの数字がよく使われますが、そればかりやっていても面白くないので、自分で撮影した画像を使った学習データを作成してみようと思います。

 

Neural Network Consoleでは、集めた画像から学習データ用のフォーマットを作るのは、Neural Network Consoleがやってくれるので、ユーザーがやるのは画像データを集めるだけ。

 

今回はInterfaceの8月号に乗っていた きのこの山 と たけのこの里 の画像をChainerを使って分類する!

という記事の内容をマネして、きのこの山 と たけのこの里 の画像をNeural Network Consoleで分類してみたいと思います。

 

 

この記事によると、それぞれの画像を約40枚撮影し、さらに画像の回転、上下、左右の反転を行うことで、画像の枚数を水増しすると書いてありましたが、画像をそれぞれ40枚(計80枚)撮影するのも大変なので、C#でWebカメラで撮影した画像から、きのこの山 や たけのこの里 の写っている部分を切り出し、その画像を90°、180°、270°回転したものと、上下、左右を反転した画像の計6枚をマウスの1クリックでファイルに保存するプログラムを、まずは作成しました。

 

※このプログラムはこちら↓のページで公開しています。

Deep Learning向け学習画像撮り込みソフト公開

 

このプログラムを使って、きのこの山 と たけのこの里 の画像をそれぞれ約1500枚の画像を撮影しました。

 

撮影した画像は、それぞれの分類ごとのフォルダに分けて保存しておきます。

 

次にNeural Network ConsoleでHomeDATASETを選択し、+Create Datasetを選択します。

 

次に学習データの設定を行います。

 

 

Source Dir 分類ごとのフォルダに分けて画像が保存されているフォルダを指定します。
Output Dir 学習データを出力するフォルダを指定します。
(最初は空のフォルダ)
Shaping Mode 元の画像と出力する画像の縦横比が異なるときの処理方法を指定します。

●Triming  画像の幅もしくは高さの短い方を出力サイズに合わせて、余計な部分をカットする

●Radding 画像の幅もしくは高さの長い方を出力サイズに合わせて、余白部分を黒(0)で埋める

 Output Color Ch  ●1(モノクロ画像)

●3(カラー画像)

 Output Width  出力画像の幅
Shufle the order of the data 画像データをシャッフルして出力します。
Output File 1 学習に用いるデータセットのファイル名(*.csv)を指定します。
Output File 2 学習データの評価用に用いるデータセットのファイル名(*.csv)を指定します。
Ratio 学習用:評価用に用いる画像の枚数の割合を指定します。

(足して100にすること)

 

上記の値を設定し、 Apply ボタンをクリックします。

 

すると、出力フォルダにリサイズされた画像とデータセットのCSVファイルが作成されます。

 

 

CSVファイルの中身はこんな↓感じに、学習用の画像画像ファイル名と正解のラベル(今回は0がきのこの山、1がたけのこの里)のペアが各行ごとに記載されいます。

 

 

これでデータセットの作成は完了です。

試しに、このデータセットを使って学習と評価を行ってみたいと思います。

 

今回は、一番シンプルな4と9の分類のサンプルプロジェクト(01_logistic_regression)を使って、データセットの部分を差し替えてみたいと思います。

 

まず、サンプルプロジェクト(01_logistic_regression)を開いて、別の名前でプロジェクトを保存します。

保存は右上の Save as より行います。

 

プロジェクトのDATASETの部分クリックします。

 

 

すると、作成したデータセットが読み込まれます。

 

 

次にデータセットがもともとの4と9の識別用のデータセットが設定されたままの状態なので、今回作成したデータセットに変更します。

 

左側に表示されているTraining と Validation の部分を選択して、右上のOpen datasetをクリックします。

 

 

今回はTraining に train.csv、Validationにtest.csv ファイルを指定しています。

 

これで、Datasetの設定も完了。

 

ニューラルネットワークの部分は一か所だけ変更しています。

手書き文字の4と9の分類の時は、モノクロ画像だったので、入力(Input)のサイズが

1,28,28

でしたが、今回はカラー画像なので

3,28,28

と変更しました。

 

 

 

続いて、Train の下の▶マークをクリックして、データの学習を行った結果がこちら↓

 

次にEvalutionの下の▶マークをクリックして、評価を行った結果がこちら↓

 

 

ただ、データセットを入れ替えて試してみただけなのに、分類の精度(Accuracy)が99.85%と表示されています。

 

まだ、Deep Learningをそんなに理解できていないのに、なんとなくで、これだけの精度が出てしまうのは、やっぱりNeural Network Consoleはすごい!!

 

適当にやっても、すぐに結果がわかる(見える)のは、大事だな~

と、つくづく関心させられてしまいます。

 

とは言っても、まだ、一つ一つの言葉が理解できていないので、Neural Network Consoleを触りながら勉強していこうと思っています。

 

※撮影に使用した きのこの山 と たけのこの里 は私がおいしく頂きました。

ちなみに、私はたけのこの里の方が好きです。

 

Deep Learningへ戻る

【Neural Network Console】GUI表示スケールの変更

Neural Network Consoleは、綺麗なGUIでいいのですが、ノートパソコンなど、小さいモニタで使うと、文字が重なってしまって見づらいときがあります。

 

そんな時には、GUI表示のスケールを変更することで少し、見やすくなるかと思います。

 

設定方法は、右上の歯車ボタン(Setup)をクリックし、VIEWタブを選択し、GUI Scaleのスライダを調整することで、GUI全体の表示スケールを変更することができます。

 

 

Deep Learningへ戻る

【Neural Network Console】CPU/GPU処理の設定切替

ソニーのNeural Network ConsoleでCPUとGPUの処理を切り替えるのは至って簡単。

 

あらかじめCUDAはインストールされている必要がありますが、Neural Network Consoleの右上の設定ボタンをクリックします。

 

次に表示された画面の ENGINEタブを選択し、CPU もしくは GPU を選択すれば、それだけで切り替わります。

 

GPUにエラーが出なければ(train_errorやvalid_errorは別)、設定が出来ているとのことですが、あまりに実感がないので、サンプルプロジェクトの学習時間の比較を行いました。

 

プロジェクト CPU処理 GPU処理
01_logostic_regression 3秒 6秒
02_binary_cnn 50秒 7秒
LeNet 4分52秒 31秒

※CPU:i7-7700K(4.2GHz)、GPU:GeForce GTX1080

 

やっぱりGPUは早い!

今回は、学習時間が待てるレベルの物を選んで比較しましが、ニューラルネットワークによっては、CPU処理では数時間かかりそうなものもあるので、効果は大きそうです。

 

関連記事

CUDAの入手、ダウンロード、インストール方法

 

Deep Learningへ戻る

【Neural Network Console】Learning Rate(学習率)の設定

Deep Learningの最適化において、素人ながらLearning Rate(学習率)の値の調整も大事なのかな?と思っているのですが、Learning Rateの値はNeural Network全体の値の設定と、各Afiineでの設定が可能になっています。

 

Neural Network全体のLearning Rateの値の設定は、プロジェクトを起動している状態で、右上にある、CONFIG をクリックします。

 

次に右側の Optimizer の部分をクリックすると、↓の画面ではAlphaの部分が学習率の値となります。

 

 

ここの表示は使用する更新の式(Updater)によって異なりますが、UpdaterがAdam(デフォルト)の時はAlphaの部分が学習率になります。

 

 

他のUpdaterの時(↓の例ではAdagrad)はLearningRateの部分がまさに学習率となります。

 

 

このLearningRateの値にさらに、各AfiineのプロパティにあるW.LRateMultiplier、b.LRateMultiplierの値を掛け合わせた値が学習率となります。

 

つまり、

重みの学習率は   LearningRateの値 x W.LRateMultiplier

バイアスの学習率は LearningRateの値 x b.LRateMultiplier

 

となります。

 

Updaterの詳細については、ダウンロードしたファイルの中にあるpdfファイル(manual_ja.pdf)に書かれているので、確認すると良いかと思います。

 

Deep Learningへ戻る

ソニーの無償AIソフト Neural Network Consoleの入手ダウンロード、インストール

GUIベースでお手軽にAIのアルゴリズムが構築でいるというソフト【Neural Network Console】がソニーより無償で公開されました。

私は、まだDeep Learningを勉強し始めたばかりなのですが、簡単だという触れ込みなのでまずは試してみました。

 

動作環境は

  ・Windows 8.1 / 10 64bit

正式には書かれていませんが、Windows7 64bitでも動作してくれました。

  ・Visual Studio 2015 C++ 再頒布可能パッケージ

 

GPUは無くても動作します。(あれば対応させる事も可能)

また、モニタはFull HDサイズぐらいないと厳しいかと思います。

 

Neural Network Consoleの入手方法は、こちらのページ↓

https://dl.sony.com/ja/

 

より、Windowsアプリではじめる をクリックします。

 

すると、ページが下の方へ移動するので、メールアドレスを入力し、上記に同意して送信をクリックします。

 

しばらくすると、画面が切り替わるので、送られてきたメールを確認します。

 

メールには、こんな感じ↓のメールが送られてくるので、Download the Windows Appをクリックして、ファイル(neural_network_console_100.zip、約1GB)をダウンロードします。

 

メールにも書かれていますが、プログラムを動作さえるにはVisual Studio 2015 C++ 再頒布可能パッケージが必要になります。

https://www.microsoft.com/en-us/download/details.aspx?id=52685

 

これは、すでにVisual Studio 2015でC++をインストールしてあれば、インストールされているかと思います。

私の場合、Visual Studio 2015→Visual Studio 2017の順でインストールしたところ、Visual Studio 2015 C++ 再頒布可能パッケージ(Visual Studio C++ 2015 Redistributable)はWindowsの設定→アプリと機能で確認しても見つからない状態でしたが、動作してくれました。

 

次にダウンロードしたzipファイルを解凍します。(解凍後は約2GBになります)

プログラムにインストールそのものは、特に操作する必要が無いのですが、解凍したフォルダを2バイト文字が含まれていない(全角の日本が無い)フォルダに配置する必要があります。

また、Program Filesのような書き込み不可のフォルダでもダメとのこと。

 

解凍したフォルダ内に実行ファイル(neural_network_console.exe)があるので、これをダブルクリックして実行します。

 

プログラム起動後に、Visual Studio C++ 2015 Redistributableが入っているか?聞かれるの、入っていいれば、そのままOK、入っていなければ、別途、Visual Studio C++ 2015 Redistributableをインストールしてください。

 

次にライセンス条項が表示されるので、内容を確認して I Agree を選択し、Applyボタンをクリックします。

 

すると、このような画面↓が表示されるのですが、あらかじめ用意されているプロジェクト(あらかじめ準備されたニューラルネットワークの構造)が表示されるので、とりあえず

01_logostic_regressin.sdcproj

をクリックしてみます。

 

このプロジェクトは手書き文字の 4 と 9 を見分けるためのもので、MNISTというデータセットから文字の画像を入手し、4か?9か?を学習して、実際に判別させるためのプロジェクトです。

 

プロジェクトを起動させると、最初にMNISTから文字の画像データ一式を取得します。

 

データの入手が終わると、このような画面になります。

 

まだ、詳細まで理解できていませんが、Input(画像の入力)があって、Affine(画像のアフィン変換かと思いきや、重みを掛けてバイアス足す処理の事のよう)を行って、活性化関数にはSigmoid関数を使い、計算結果と出力の値が最小化されるような処理を行っている

という、シンプルな構成。

 

次に右上のTraningの下にある▶ボタンをクリックすると、学習が始まります。

 

Evalutionの下にある▶ボタンをクリックすると、学習データを用いて実際に画像を認識させた結果が表示されます。

 

ここでは x:image の部分が認識用に使った画像、 y:9 の部分が教え込んだ情報(0だと4の文字、1だと9の文字)、 y’の部分が判定結果になります。

判定結果は0に近いほど4の文字と認識していて、1に近いほど9の文字と認識しています。

 

この結果で認識が怪しい部分(0.5に近い部分)を抜き出してみると、こんな感じ↓

 

 

人の目で見ると126番はあきらかに4だし、203も同様に9にしか見えませんが、このサンプルプロジェクト的には上手く判別できていないようです。

 

この辺のチューニングが容易に、しかも結果がすぐにわかるのがNeural Network Consoleのプログラムの良いところだと思います。

しかし、結局はDeep Learningの知識は必要になるので、ゼロから作るDeep Learningの本でも読むか?っていう感じです。

 

 

また、ソニー製なので、日本語のマニュアルがあるのも助かります。

まずは、解凍したファイル内になったPDFファイル(manual_ja.pdf)に目を通すと良いかと思います。

 

参考ページ

Neural Network Consoleドキュメント(日本語)

https://blog.dl.sony.com/259/

 

Deep Learningへ戻る