LoginSignup
16
10

More than 5 years have passed since last update.

Neural Network Consoleで遊んでみる~その2~

Last updated at Posted at 2017-12-18

はじめに

この記事は『Deep Learning初心者,プログラミング初心者だけどDeep Learningしてみたいな~でもやり方わからないしな~』といった人向けであります.

また,前回(Neural Network Consoleで遊んでみる~その1~)の続きになります.

動機

前回までで,GUIで簡単にDeep Learningできた!
よし!改造しよう!(ある程度)自由自在にできる!!...はずである.
やりましょう.

この記事の目的(前回同様)

NNCで(ある程度)任意のネットワークでMNISTデータセットの線形分類をできるようになる.
~その1~:インストール,とりあえず実行
~その2~:改造に挑戦

※MNISTデータセット:グレースケール手書き数字画像のデータセット.
 1つの画像の大きさは縦横28*28ピクセル.
 クラス数は10で学習用60000枚,テスト用10000枚(クラス毎に枚数は異なる).
 クラス分類タスクの評価指標によく使われる.

扱うNeural Network(前回同様)

~その1~:Multi-Lyaer Perceptron(MLP)
~その2~:Convolutional Neural Network(CNN)

さっそく今回は改造してみましょう!

CNNに改造

さて,改造前にどう改造するのかみてみましょう.

そもそもCNNとは?

Convolutional(畳み込み)なNeuralNetwork(ニューラルネットワーク)です.
そのまんまですね.
正確には畳み込みを”する”ニューラルネットワークです.

大きく2段に分かれています.
前段には,畳み込みとプーリングを行う層(Convolution層,Conv層)があります.
後段には,MLP層(Full Connect層)があります.
前段の『畳み込み』フィルタと『プーリング』フィルタで特徴を抽出,後段のMLPで分類といった形です.
図示するとこんな感じです.

cnn.png

なんだかフワッとしていますがいいでしょう.
理論について詳しくはまた後程...

実装(ちょっと長め)

お気づきの通り,MLPに『畳み込み』と『プーリング』の2つを加えてあげればいいだけです.
前回の10_deep_mlp.sdcprojを開きましょう.
そして左側のEDITを選択してネットワークをいじる画面に移行します.

まずは『畳み込み』を足してみます.
Components→Basic→Convolution
ここで『Convolution』をダブルクリック,またはドラッグ&ドロップしましょう(赤丸部分).

NNCdeep_mlp_evaluate_step1.png

何か出てきましたね.
続いて黄色の丸に注目です.この片方だけコッソリ繋げてみたやつ.
これは『コネクション』を表します.
繋がっているところをデータが伝搬します.MLPの図の層間の線と同じです.
『Convolution』の上を『I』,下を『A』にそれぞれ繋げましょう.

NNCdeep_mlp_evaluate_step2.png

これだけで層の追加は完了です.

同様にして『プーリング』も足しましょう.
Components→Pooling→MaxPooling
『MaxPooling』をダブルクリック,ドラッグ&ドロップ.

NNCdeep_mlp_evaluate_step3.png

これで『Conv層』の追加が完了しました.
非常に簡単です.
なんなんだこれは.

さらに『畳み込み』と『プーリング』を1つずつ追加します.
プーリングはなんとなく『AveragePooling』にしてみます.
Components→Pooling→AveragePooling
※『Components』ウィンドウの右スライドバーを動かすと出てきます.

ついでに『Dropout』も追加してみます.
Components→Others→Dropout

つなげるとこんな感じになりますね.

NNCdeep_mlp_evaluate_step4.png

せっかくなので2つ目の『Conv層』の『畳み込み』と『プーリング』のフィルタのサイズを変えてみましょう.
『Convolution_2』(赤丸)をクリックすると,『Components』の下に『Layer Property』というウィンドウが現れますね.
そこの『KernelShape』(水色丸)を適当にいじります.
正方になっていれば大丈夫ですが,ここはとりあえず(3,3)にします.
同様にして,『AveragePooling』も『KernelShape』を(2,2)にしてみます.

NNCdeep_mlp_evaluate_step5.png

本来ならカーネルサイズを変更したら,後段の入力サイズも変更する必要があるんですが,
なんとNNCでは自動で変更してくれます.
ものすごい便利!!
GoogLeNetみたいな深層で複雑なモデルもサクッと組めそうですね.
※GoogLeNetはググればすぐ出てくると思います.

さて,ネットワークがMLP→CNNとレベルアップしたので,
データセットもMNISTの4と9→MNIST全部にレベルアップしましょう.
上の『DATASET』タブ→Open dataset(赤枠右上の青吹き出し)
『Training』→『mnist_training.csv』(水色枠)
『Validation』→『mnist_test.csv』(赤色枠)

NNCdeep_mlp_evaluate_step6.png

学習させてみると...

NNCdeep_mlp_evaluate_step7.png

MLPよりちょっと時間はかかりますけど,
えぐい角度でエラー率が下がってますね.
前段に特徴抽出がついてるため,分類しやすいんですね.
MNISTとはいえ,さすがのCNN.

続いてテスト結果も見てみましょう.

NNCdeep_mlp_evaluate_step8.png

なんだか前回と違う...
ラベルの値が1or0じゃない...
ここで学習させたDATASETがどんなものだったか見てみます(今さらですが...).

NNCdeep_mlp_evaluate_dataset_detail.png

前回と違って(画像、画像の数字)をセットにして学習させているんですね.
『y:label』→画像の数字
『y'』→『入力した画像』が『y:label』である可能性
こう考えて改めてテスト結果を見ると,なんだかしっくりきますね.

まとめ

今回の目的は『NNCで(ある程度)任意のネットワークでMNISTデータセットの線形分類をできるようになる.』でしたが...
まぁ,達成はできたんじゃないでしょうか.
今度はデータセットの入れ替えや,autoencoder,recurrent neural network系にも挑戦したいですね.

16
10
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
16
10