プログラミング上達したい人が書くブログ

プログラミング上達したい人が書くブログ

主に、アニメやPython、C++、競技プログラミング(初心者)について書きたいです。また、1週間に一つの記事を心掛けています。学生です。備忘録と書かれたものは他人に見せることを考えて書いてないため見にくいです。

Neural Network Console 使ってリンゴとブドウの分類してみた Part2

前記事URL

 

前回まででやったこ

 Imagespiderを使って画像を集めて、データセットを作りました。

 

ニューラルネットワークの設計

 データセットは作ったため、とうとう設計していこうと思います。といっても、この問題は2値分類問題となるため、サンプルプロジェクトの一番上のやつをそのまま引用すれば設計できます。そして、設計図は以下のようになります。

f:id:sachishimei:20170913212142p:plain

 ここで気づく人もいると思いますが、Inputの横の数字の部分がデフォルトだと「1,28,28」になっていたはずが、「3,28,28」になっています。これは、今回カラー画像でデータセットを作っているからです。前記事でも、データセットを作るときRGBのところにチェックを入れていました。仮に、「1,28,28」でトレーニングしようとすると、

ValueError: could not broadcast input array from shape (10,3,28,28) into shape (10,1,28,28)

というエラーが出てきます。

 

 Affineはレイヤーリファレンスから引用すると、

全ての入力値から、OutShapeプロパティで指定する全ての出力ニューロンへの結合を持つ全結合層です。

 

o = Wi+b

(iは入力、oは出力、Wは重み、bはバイアス項を示す)

と書かれています。OutShapeプロパティでは出力ニューロン数を指定していますが、今回は1を指定しています。

 

 Sigmoidのリファレンスは、

入力値のSigmoidによる処理結果を出力します。確率など0.0~1.0の出力値を得たい場合に使用します。

 

o=sigmoid(i)

(oは出力、iは入力を示す)

となっています。

 

 BinaryCrossEntropyのリファレンスは、

データセットの変数との相互情報量を最小化するニューラルネットワークの出力層です。2値分類問題(0 or 1)を解く際に使用します。BinaryCrossEntropyの入力値は0.0~1.0(確率値)、データセットの変数は0もしくは1である必要があります。プロパティはSquaredErrorと共通です。

となっています。書いてある通り、2値分類問題における出力層として使われています。

引用部分のURLは以下に貼っておきます。

support.dl.sony.com

 

トレーニング

 私の場合、トレーニング用と評価用のデータの個数が38個ずつしかありませんでした。その状態で、トレーニングすると以下のようなエラーが出ます。

[Error 1] Batch size is larger than dataset "Training".
[Error 2] Batch size is larger than dataset "Validation".
2 errors.

バッチサイズが各データセットより大きいということを言っています。バッチとはなんぞやと思いましたがよくわかりませんでした。とりあえず、ミニバッチサイズというもののことを指しているようで、ミニバッチとは、学習するときにデータを分けることで学習時間の高速化を図る技術のことです。

 変更にはCONFIGタブのGlobal Configの部分にあるBatch Sizeをデータ量以下に変更します。今回でいえば38以下になります。下画面ではデフォルトの数値である64になっています。

f:id:sachishimei:20170913215520p:plain

 

 トレーニング結果は以下の画像の通りとなります。

f:id:sachishimei:20170913215806p:plain

 Epochが進むごとに0に近づいているので、どうやら成功しているようです。

 

評価してみた

 評価したときのConfusion Matrixは以下の画像のようになります。

f:id:sachishimei:20170913220458p:plain

 正確性は約86%となっています。実生活で使ったりするにはちょっと低い数値かなあと思います。ただ、今回はデータ数が少ないことや全く関係なさそうなデータ(2次元の女の子の画像など)が含まれている中では結構いい数値ではないかと思います。

 

終わりに

 今回、2値分類問題について取り組んだわけですが、こういうのって実際のWebサービスやアプリに使えるのかが疑問です。具体的には、GUIで書いたものをPythonコードに直すことができるのかとかですね。そういうことができないと、あんまりこのIDEは使う人が増えないと思います。

 また、これはニューラルネットワーク全体について言えることですが、ビッグデータを手に入れる手段がないため、その分野が個人利用の部分で発展しないのだと思います。私は今回Imagespiderを使っているわけですが、関係のない画像が入ってしまうなどデータセットとしての質が落ちてしまいます。本当は、私も欲をいうならば「男の娘か本物の女性の判定」も行ってみたいし、「ある人物がツインテールかどうか」などもやってみたいです。ですが、そのデータを手に入れる手段がないためできません。

 結局、質の高いビッグデータの共有場所が望まれるということです。

 また、リンゴとブドウの分類ではいろいろ試してみるつもりですが、もし正確性がよくなったら別記事に書いてみようと思います。