【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++)に落とし込む方法を調べてみようと思っています。

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

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

最近はソニーのNeural Network Consoleを触りながらDeep Learningのお勉強をしているのですが、先日書いた記事

 

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

 

で使ったUSBカメラで撮影し、部分的に画像を切り出し、画像の回転、反転を行うソフトをソースコード付きで公開します。

 

プログラムはこちら↓からダウンロードしてください。

TrainingImageCapture100

 

使っているソフトは様子は、こんな感じ↓です。

 

プログラムはファイルを解凍後、

├ bin
└ source

 

となっています。

プログラムを使うだけなら、binフォルダ内のTrainingImageCapture.exeを実行してください。

sourceはこのプログラムのソースコードです。

 

開発環境は

Windows10 64bit

Visual Studio 2015

OpenCvSharp

開発言語:C#

※実行にはUSBカメラが必要です。

 

使用方法

USBカメラをあらかじめ接続しておきます。

プログラム(TrainingImageCapture.exe)を起動後、下記の設定を行います。

 

Save Folder 画像の保存先フォルダを指定します。
Prefix ファイル名の先頭の名前を指定します。

指定した名前に5桁のシリアル番号を付けてファイルに保存します。

File Type 保存するファイル形式(jpg、bmp、png、Tif)を指定します。
ROI 切り出す画像サイズの幅と高さを指定します。
Data Augmentation 画像の回転(90°、180°、270°)、左右・上下反転を行う場合はチェックを入れます。

 

 

画像上をマウスの左クリックで撮影領域(赤い四角の部分)を指定します。

画像上をマウスの右クリックで撮影領域内の画像をファイルに保存し、Data Augmentationで指定された画像も同時に保存されます。

 

トラブルシューティング

Visual Studio でプログラムを起動後、フォームウィンドウの表示でエラーになる場合があります。

その場合は、フォームのウィンドウを閉じて、ビルドを行ってみてください。

【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へ戻る