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

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

同じCNNでも組み方で学習精度が変わるのをGUIで体験:使い方5/ニューラルネットワークコンソール

画像データのinputに対して、CNN(Convolutional Neural Network)の各レイヤーの構成の仕方で、学習精度が変化するところを、プログラミング無しのGUI操作のみで、実際に組み替えて試してみます。

 

この記事の対象読者は、文系で数学は苦手でプログラムも得意ではないけど、人工知能・・特に深層学習(ディープラーニング)の技術には興味があるという方を想定しています。

 

また、続きもの的に前回からの引き続きで書いている部分もあるので、まだの方は、下記の一覧で使い方1から順番に読んでもらえると、よりわかりやすいかと思います。

arakan-pgm-ai.hatenablog.com

 

さて、続けます。

 

文系で数学が苦手だけど、人工知能技術には興味がある・・という方向けに記事を書こうとしている・・と言いながら、いきなり、CNNなんて専門用語を使ってすいません。

 

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