#はじめに
この記事は『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で分類といった形です.
図示するとこんな感じです.
なんだかフワッとしていますがいいでしょう.
理論について詳しくはまた後程...
##実装(ちょっと長め)
お気づきの通り,MLPに『畳み込み』と『プーリング』の2つを加えてあげればいいだけです.
前回の10_deep_mlp.sdcprojを開きましょう.
そして左側のEDITを選択してネットワークをいじる画面に移行します.
まずは『畳み込み』を足してみます.
Components→Basic→Convolution
ここで『Convolution』をダブルクリック,またはドラッグ&ドロップしましょう(赤丸部分).
何か出てきましたね.
続いて黄色の丸に注目です.この片方だけコッソリ繋げてみたやつ.
これは『コネクション』を表します.
繋がっているところをデータが伝搬します.MLPの図の層間の線と同じです.
『Convolution』の上を『I』,下を『A』にそれぞれ繋げましょう.
これだけで層の追加は完了です.
同様にして『プーリング』も足しましょう.
Components→Pooling→MaxPooling
『MaxPooling』をダブルクリック,ドラッグ&ドロップ.
これで『Conv層』の追加が完了しました.
非常に簡単です.
なんなんだこれは.
さらに『畳み込み』と『プーリング』を1つずつ追加します.
プーリングはなんとなく『AveragePooling』にしてみます.
Components→Pooling→AveragePooling
※『Components』ウィンドウの右スライドバーを動かすと出てきます.
ついでに『Dropout』も追加してみます.
Components→Others→Dropout
つなげるとこんな感じになりますね.
せっかくなので2つ目の『Conv層』の『畳み込み』と『プーリング』のフィルタのサイズを変えてみましょう.
『Convolution_2』(赤丸)をクリックすると,『Components』の下に『Layer Property』というウィンドウが現れますね.
そこの『KernelShape』(水色丸)を適当にいじります.
正方になっていれば大丈夫ですが,ここはとりあえず(3,3)にします.
同様にして,『AveragePooling』も『KernelShape』を(2,2)にしてみます.
本来ならカーネルサイズを変更したら,後段の入力サイズも変更する必要があるんですが,
なんとNNCでは自動で変更してくれます.
ものすごい便利!!
GoogLeNetみたいな深層で複雑なモデルもサクッと組めそうですね.
※GoogLeNetはググればすぐ出てくると思います.
さて,ネットワークがMLP→CNNとレベルアップしたので,
データセットもMNISTの4と9→MNIST全部にレベルアップしましょう.
上の『DATASET』タブ→Open dataset(赤枠右上の青吹き出し)
『Training』→『mnist_training.csv』(水色枠)
『Validation』→『mnist_test.csv』(赤色枠)
学習させてみると...
MLPよりちょっと時間はかかりますけど,
えぐい角度でエラー率が下がってますね.
前段に特徴抽出がついてるため,分類しやすいんですね.
MNISTとはいえ,さすがのCNN.
続いてテスト結果も見てみましょう.
なんだか前回と違う...
ラベルの値が1or0じゃない...
ここで学習させたDATASETがどんなものだったか見てみます(今さらですが...).
前回と違って(画像、画像の数字)をセットにして学習させているんですね.
『y:label』→画像の数字
『y'』→『入力した画像』が『y:label』である可能性
こう考えて改めてテスト結果を見ると,なんだかしっくりきますね.
#まとめ
今回の目的は『NNCで(ある程度)任意のネットワークでMNISTデータセットの線形分類をできるようになる.』でしたが...
まぁ,達成はできたんじゃないでしょうか.
今度はデータセットの入れ替えや,autoencoder,recurrent neural network系にも挑戦したいですね.