初心者
DeepLearning
NeuralNetworkConsole

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

はじめに

この記事は『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系にも挑戦したいですね.