アラカン"BOKU"のITな日常

文系システムエンジニアの”BOKU”が勉強したこと、経験したこと、日々思うこと。

構成の異なるシンプルなCNNで精度が変わるかをやってみる:使い方5/ニューラルネットワークコンソール

CNN(Convolutional Neural Network)の各レイヤーの構成の仕方で、学習精度が変化するかを、実際に組み替えて試してみます。

 

その前に、CNNの概要を簡単に整理しときます。

 

理論的には難しいですが、使うだけなら、ざっくり「画像認識の正解率があげるのに効果がある技術」ということで良さげです。

 

数学の計算式が大丈夫な方は、こちらの説明が比較的わかりやすいので、一応、紹介しておきますが、苦手な方はとばしてもいいです。

deepage.net

 

ニューラルネットワークコンソールのレイヤーで言えば、Convolution と Poolingという2つのレイヤーを組み合わせて使うやり方のことを、「CNN」と呼ぶと認識しておけば、使うことはできますから。

 

組み合わせ方は、次の2パターンがあると、とりあえず覚えておけばいいです。

f:id:arakan_no_boku:20170826103254j:plain

 

今回、体験してみようと思っているのは、同じ、Convolution と Poolingを同じ数だけ積み重ねた時に、組み合わせ方によって、学習精度に差はでるのだろうか?ということです。

 

普通に考えれば、同じ効果のあるレイヤーを同じ数組み合わせたら、同じような結果になりそうに思えますからね。

 

じゃあ、とりあえず動かしていってみます。

 

ニューラルネットワークコンソールを起動します。

f:id:arakan_no_boku:20170825230839j:plain

 

一番シンプルな「01_logistic_regression.sdcproj」を開きます。

 

作業用にするので、名前をつけて保存を選んで、別の名前でプロジェクトを保存しておきます。

f:id:arakan_no_boku:20170825231525j:plain

 

まず、inputデータは、そのまま、デフォルトの「4」と「9」の2択を使います。

 

inputデータを、フルで「0」から「9」までの10パターンを使うようにもできます。

 

データが大きくなると、恐ろしく時間がかかるようになって、「気楽に」という感じでなくなるので、今回はしませんが、一度やってみたい方のために変更方法だけ確認しておきます。

 

プロジェクトを開いた状態で「DATASET」を選びます。

f:id:arakan_no_boku:20170826105247j:plain

 

左側の「training」を選んで、OpenDataset(上図 赤丸部分)を押します。

 

表示された選択肢から「minist_training.csv」を選びます。

f:id:arakan_no_boku:20170826110226j:plain

 

同じようにして、validationを左側で選んで、今度は「minist_test.csv」を選択しておきます。

 

選択し終わったら、忘れずに上書き保存をしておきます。

 

これで、テストデータはMNIST(手書き数字画像)のフルセット(10パターン)が使えるようになります。

 

もし、inputをフルセットに変更した場合は、EDITタブに戻って、今度は「BinaryCrossEntropy」を選択して、Deleteキーで消し、と「SoftmaxCrossEntropy」をドロップして、Shiftキー+クリックで線でつなぐようにします。

f:id:arakan_no_boku:20170826111723j:plain

 

inputが2値(4か9のどちらか)ではなく、10値(0から10のどれか)になったので、BinaryCrossEntropyのままだと、結果が無茶苦茶になるからです。

 

時間に余裕のある方は、一度試してみてもよいかもしれません。

 

実は、このプロジェクトにシンプルなCNNレイヤーを追加するパターンは一度、二回目でやってます。

arakan-pgm-ai.hatenablog.com

 

変更前の正確さは「約95%」で変更後が、「約98%」でした。

 

前回のパターンは、Convolution+ReLUのレイヤーが一段のパターンです。

f:id:arakan_no_boku:20170826123227j:plain

 

なので、今回は左側のパターンでやってみます。

 

Convolution+ReLUが2層になることで、どうなるのか?・・ですね。

 

さて、CNNのレイヤーを追加していきます。

 

ポイントは最後はAffineの層を残して、上に追加するところです。

 

inputとAffineの間をあけて、間の線を消します。

 

それで、以下の順番にレイヤーをドロップしていきます。

  1. convolution
  2. ReLU
  3. convolution
  4. ReLU
  5. MaxPooling

 f:id:arakan_no_boku:20170826123732j:plain

 

その間をShiftキーを押しながらクリックして、線をつなぎます。

f:id:arakan_no_boku:20170826123620j:plain

 

この状態で上書き保存して、学習をします。

 

inputデータの量は増やしていないですが、CNNの層を深くすると、処理時間はそれなりにかかるようになります。

 

開始ボタンを押してから、シャワーをゆっくり浴びて帰ってくるくらいの時間は待つつもりでどうぞ。

 

学習結果はこんな感じです。

f:id:arakan_no_boku:20170826125804j:plain

 

評価結果は、98,6%。

 

2回目の結果よりは、98,4%ですから、微妙な改善です。

 

でも、やっているとわかりますが、Accuracy(正確さ)97%くらいまでは、ちょっとした変更で大幅に改善します。

 

ですが、そこから先・・特に98%→99%の間は、なかなかのハードルがあります。

 

だから微妙な改善ですが、良い結果じゃないですかね。

 

じゃあ、次は同じ「Convolution」+「ReLU」2つでも、Poolingを間にもうひとつ挟む方法に変えてみます。

  1. convolution
  2. ReLU
  3. MaxPooling
  4. convolution
  5. ReLU
  6. MaxPooling

こんな感じですね。

f:id:arakan_no_boku:20170826132310j:plain

 

この学習結果グラフはこうです。

f:id:arakan_no_boku:20170826132501j:plain

 

それで正確さは・・なんと99%になりました。

f:id:arakan_no_boku:20170826132539j:plain

 

こうして試していくと、レイヤーの組み合わせとしては、このパターンが一番よさそうですね。

 

これで上書き保存しておきます。

 

どうですかね。

 

CNNは画像処理に関しては正確性がすごく上がるが、データ量の増加や層が増えるに従って、学習時間が非常に長くなる。

 

同じ各レイヤーを使っていても、その組み合わせ方や順番で学習結果に差がでる。

 

こういう話はよく本に書いてあります。

 

けど、文章で読むだけでは何となくわかったつもりでも、ピンとこないはずです。

 

こういうことは実際にやってみると、よくわかりますよね。

 

だから、気楽にやってみることができる、ニューラルネットワークコンソールみたいな環境は重要だと思うんですよね。

 

 


前の記事

 関連するカテゴリ一覧(この一覧の使い方1から順番に読むことをおすすめします)

arakan-pgm-ai.hatenablog.com

 

f:id:arakan_no_boku:20170910161122j:plain