SE_BOKUのまとめノート的ブログ

SE_BOKUが知ってること・勉強したこと・考えたことetc

オリジナル画像で新規データ・セットを追加する/Neural Network Consoleの使い方

ニューラルネットワークコンソールに付属のMNISTばかりだと飽きるので、オリジナルの学習・評価用画像を使って、新規データ・セットを作成します。 

f:id:arakan_no_boku:20190326212937j:plain 

オリジナル画像データの準備

画像データをどこかから取得してくるか、自分で作る必要があります。

ただ、今回はinputの「1,28,28」というサイズは変更しない・・つまり、MNISTと同じモノクロの28×28サイズの画像を前提として、やりたいと思います。

カラー画像を使った場合のやり方は、こちらの記事で「Caltech」の画像データを使ってやってますので、こちらをどうぞ。

arakan-pgm-ai.hatenablog.com 

モノクロの28×28画像データ

ちょっと手頃なものが思いつかなかったので、自分で作ることにします。

とりあえずEXCELの「画像データ大量生成ツール」を作って、それを使います。 

この「画像データ大量生成ツール」のダウンロード場所や仕組み(VBAソースコード含む)と、使い方の解説はこちらに書いてます。

arakan-pgm-ai.hatenablog.com

 興味のある方はどうぞ。 

2017/12/01追記

>以降の説明の画像は、Version1.00のものを使ってます。

>Version1.10で一部アイコンのデザインが変更になっています。

>ただ、見ればわかる範囲と判断して画面の貼り替えはしていません。 

画像データの取得

今回は、作った画像データがある前提で、取得するところからはじめます

GitHubから画像データをダウンロードします。

github.com

bokudate.zipを解凍してください。 

今回用意した画像データはこんな感じにアルファベット1文字を、様々なフォントと文字サイズと場所でバリエーションを作ったものです。

f:id:arakan_no_boku:20170902223040j:plain

 この「A,a」なら「0」、「B,b」なら「1」を正解として、フォルダを作ってます。 

フォルダ名とかは変更しないでください。 

画像データの配置ルール

ニューラルネットワークコンソールの画像データは、以下のルールに従って格納する必要があります。

  • フォルダ毎に分類されていないといけない。
  • フォルダ名が正解ラベルと一致していないといけない。
  • フォルダ名と正解ラベルは、0,1,2・・等の数字にしておく

 ようするに、ニューラルネットワークコンソールの画像データは、正解ラベル(例えば、0とか1とか)の名前にしたフォルダの下に、サイズを揃えた画像データを置いておけば良いということです。  

作業用フォルダの準備

ダウンロードしたファイルを解凍して、適当なフォルダに置きます。 

このフォルダはあくまでワーク用の一時フォルダです。 

今回は、c:\tmp\bokudata というフォルダを作って、そこに置きました。

f:id:arakan_no_boku:20170902232400j:plain

ここで、気をつけないといけないことがあります。 

・このフォルダに他のファイルをおかないこと

・ファイル名やフォルダ名に全角文字を含めないこと

です。 

おいても、DATASET作成時にはエラーにはならなくても、学習や評価の実行時に原因不明としか見えないエラーで苦しむことになります。  

新規データセットを格納する本番用フォルダ

今度は、DATASETを格納する「本番用」のフォルダを作ります。 

ここで注意するのは。 

本番用のフォルダにファイルをコピーするのは、ニューラルネットワークコンソールにまかせる必要がある

ということです。  

今回は、{ワークフォルダ}の下に適当なフォルダを作ります。 

今回は、「bokudata」にしました。 

ニューラルネットワークコンソールで新規データ・セット作成

ニューラルネットワークコンソールを立ち上げます。

f:id:arakan_no_boku:20170902223807j:plain

 そして、DATASETを開き、「+ Create Dataset」ボタンを押します。  

Create Dataset

ここで必要な項目を入力します。

f:id:arakan_no_boku:20190329231519j:plain

 簡単に解説しておきます。 

Source Dir

 :ダウンロードしたデータを置いたフォルダを指定します。

 :今回の場合、c:\tmp\bokudata です。

Output Dir

 :処理済のデータを出力するフォルダを指定します。

 :今回の場合、{ワークフォルダ}\bokudataです。

 :Source Dir と Output Dir は必ず別のフォルダでないとエラーになります。

Shaping Mode

 :画像を指定したサイズにあわせる方法を指定します。

    :以前はトリミングとパディングだけでしたが、ReSizeが追加されました。

     : よほどのことが無い限り、ReSizeでいいと思います。

Output Color Ch

 :今回はモノクロデータなので、「1」です。

 :カラー画像の場合は「3」に変更します。

Output Width

 :出力画像の横幅です。今回は「28✕28」ですから、28です。

Output Height

 :出力画像の縦幅です。今回は「28✕28」ですから、28です

Shuffle the order of the data

 :デフォルトのまま(ON)にします。シャッフルしてくれます。

File Name

 :作成するデータセットCSVのファイル名です。

 :後で識別しやすい名前に変更します。

Ratio (%)

 :ここで指定した比率で、学習用データとテスト用データに振り分けてくれます。

 :学習用 75 テスト用 25 くらいが適当じゃないですかね。

 :ここを変更する時は、合計100になるように注意します。

入力できたら、「Apply」ボタンを押します。 

しばらく、こんな感じの画面がでてきますけど、待ちます。

f:id:arakan_no_boku:20170902234759j:plain

 処理が終わると、こんな感じでプレビューされます。

f:id:arakan_no_boku:20170902234844j:plain

 テキストデータを扱う時には、パスと正解ラベルを書いたCSVデータを、自分で作らないとダメだったのですが、画像の場合は、そのファイルもニューラルネットワークコンソールが自動生成してくれます。 

ここまでで、データ・セットの作成手順は終わりです。 

以降は、追加したデータ・セットを新規プロジェクトで使って、ちゃんと学習・評価できるかを見ていきます。

新規プロジェクト作成

まず、確認用のプロジェクトを作ります。 

動作確認するだけなら、すでに作成済のプロジェクトやサンプルプロジェクトのデータ・セットだけ差し替えるだけでも可能です。 

なんですけど、今回は新規に作ったものでしてみます。 

PROJECTを開いて、「New Project」ボタンを押します。

f:id:arakan_no_boku:20170902235819j:plain

浅いCNNモデルを定義

以下の順番でレイヤーをドラッグ&ドロップして、Shift+クリックで線でつなぎます。

  1. input
  2. convolution
  3. ReLU
  4. MaxPooling
  5. convolution
  6. ReLU
  7. MaxPooling
  8.  Affine
  9. Sigmoid
  10. BinaryCrossEntropy

超シンプルなCNN(Convolution Neural Network)です。

f:id:arakan_no_boku:20170903000525j:plain

とりあえず、この辺で一回名前をつけて、プロジェクトを保存しておきます。

f:id:arakan_no_boku:20170903002748j:plain

 

名前は自分がわかりやすければ、なんでもいいので、適当につけて・・っと。 

今回は、保存先も{ワークフォルダ}の下に適当なフォルダをつくって置くことにしてます。 

さて、保存できたら、設定していきます。 

DATASETタブ

まず、DATASETタブを開きます。

f:id:arakan_no_boku:20170903001244j:plain

 右上の「Open dataset」ボタンを押し、表示された選択肢の中から、TrainingとValidationにそれぞれ、さきほど生成時に入力したCSVファイル名をさがして割り当てていきます。

正しく割当できていれば、Trainingが2640件、validationが880件になっているはずです。

f:id:arakan_no_boku:20170903001651j:plain

 EDITタブ(各レイヤーの設定)

 続けて、各レイヤーを設定していきます。 

今回はわざとデフォルトの設定にあわせて、データを作成しているので変更はいりませんが、サイズ等を変更した場合は、画像にあわせて変更する必要があります。  

Convolutionレイヤーの初期値変更

Convolutionレイヤーは2つとも、W.initializerを「NormalAffineHeForward」に変更しておきます。

f:id:arakan_no_boku:20170903002306j:plain

 理由がわからない場合は、こちらの記事も見てください。

arakan-pgm-ai.hatenablog.com 

AffineのOUTPUTサイズ

次にAffineのOUTPUTを、デフォルトの100から1に変更します。

f:id:arakan_no_boku:20170903145454j:plain

 これをせず、デフォルトの100のままでもエラーにはならないですけど、正確さが20%とか30%とかに落ちてしまったりします。 

学習実行 

この設定で学習をやってみます。

f:id:arakan_no_boku:20170903003648j:plain

 何かいい感じのきれいな学習曲線になってます。

f:id:arakan_no_boku:20170903145950j:plain

評価の実施

続けて、評価もやってみます。

f:id:arakan_no_boku:20170903150102j:plain

 

99.2%!上出来です。

f:id:arakan_no_boku:20170903150133j:plain

 

まあ、MNISTと同じようなデータをアルファベットで作ってみた・・というだけなので、結果がこうなるのは当然なのですがね。 

ただ、作成した独自画像データ・セットが使えて、かつ、DATASETへの追加手順も間違ってはないようだということで、めでたし、めでたしです。 

ではでは。 

2017/12/01追記

Version1.10で主にこの部分のアイコンのデザインが変わってます。

f:id:arakan_no_boku:20171130202351j:plain