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

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

同じ深さのCNNでも構成が変わると精度が変わる:使い方5/ニューラルネットワークコンソール

CNN(Convolutional Neural Network)は、全結合層だけでなく畳み込み層(Convolution )とプーリング層(Pooling)から構成されるニューラルネットワークのことです。

 

ざっくり「画像認識の精度向上に圧倒的な効果がある技術」ということです。

 

理論的には結構難しいです。

 

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

deepage.net

 

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

 

2017/12/01追記

>以下の説明に使っている画面例は、Version1.00のものです。

>Version1.10で一部アイコンデザイン等が変わっています。

>しかし、説明への影響がないと判断し、差し替えはしていません。

 

CNNの構成に関する素朴な疑問

本を読むと、CNNといっても、 、ConvolutionレイヤーとPoolingレイヤーの組み合わせ方には次の2パターンがあります。

 

f:id:arakan_no_boku:20170826103254j:plain

 

右が、Convolution+ReLUの組み合わせ1組に対してMaxPoolingレイヤーが1個というパターン。

 

左は、Convlution+ReLuの組み合わせを2回繰り返した後に、MaxPooloingがくるパターンです。

 

この2つのパターンで、深さを同じにしたときに、学習精度に差はでるのだろうか?というのが今回の疑問です。

 

まず、左側のパターンで学習と評価をする

 

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

f:id:arakan_no_boku:20170825230839j:plain

 

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

 

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

f:id:arakan_no_boku:20170825231525j:plain

 

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

 

実は、上記の右側の1層だけのパターンは、すでに別記事でやってます。

arakan-pgm-ai.hatenablog.com

 

赤枠の、Convolution+ReLUのレイヤーが一段のパターンです。

f:id:arakan_no_boku:20170826123227j:plain

 

結果の正確さは、「98,4%」でした。 

 

これが比較の基準値になります。

 

さて、左側のパターンです。

 

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%。

 

基準値が、98,4%ですから、微妙な改善です。

 

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

 

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

 

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

 

次は右のパターンを2層にしてみる

 

じゃあ、次は右のパターンを2層にしてみます。

 

同じ「Convolution」+「ReLU」2つでも、Poolingを間にもうひとつ挟む方法に変えてみるわけですから、1つ目のReLUと2つ目のConvolutionの間に「MaxPooling」を挟めばいいですね。

  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

 

まとめです

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

 

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

 

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

 

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

 

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

 

おまけ:対象データ数を増やすやり方

上記では、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のままだと、結果が無茶苦茶になるからです。

 

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

 

2017/12/01追加

 Version1.10でアイコンデザインが変更になった主な部分はここです。

f:id:arakan_no_boku:20171130202351j:plain

見たら、だいたいわかりますよね。

 


次の記事

arakan-pgm-ai.hatenablog.com

 

ニューラルネットワークコンソールカテゴリの記事一覧はこちらです。

arakan-pgm-ai.hatenablog.com

 

f:id:arakan_no_boku:20171115215731j:plain