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

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

また，[前回](https://qiita.com/szk1akhr/items/0dc360376a69a7bb2ea4)(Neural Network Consoleで遊んでみる～その1～)の続きになります．

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

#この記事の目的(前回同様)
NNCで(ある程度)任意のネットワークでMNISTデータセットの線形分類をできるようになる．
[～その1～](https://qiita.com/szk1akhr/items/0dc360376a69a7bb2ea4)：インストール，とりあえず実行
～その2～：改造に挑戦

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

#扱うNeural Network(前回同様)
[～その1～](https://qiita.com/szk1akhr/items/0dc360376a69a7bb2ea4)：Multi-Lyaer Perceptron(MLP)
～その2～：Convolutional Neural Network(CNN)


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

#CNNに改造
さて，改造前にどう改造するのかみてみましょう．

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

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

![cnn.png](https://qiita-image-store.s3.amazonaws.com/0/165289/6f8bfd8f-928c-9eee-8020-12eae11cd646.png)

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

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

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

![NNCdeep_mlp_evaluate_step1.png](https://qiita-image-store.s3.amazonaws.com/0/165289/c5a79c3a-20f0-9218-c51e-89ac8229be1d.png)

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

![NNCdeep_mlp_evaluate_step2.png](https://qiita-image-store.s3.amazonaws.com/0/165289/dbe23e53-0d40-2cf6-9732-7489c669e9ba.png)

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

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

![NNCdeep_mlp_evaluate_step3.png](https://qiita-image-store.s3.amazonaws.com/0/165289/103a5676-1a1d-b707-6004-cda120d66e6f.png)

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

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

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

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

![NNCdeep_mlp_evaluate_step4.png](https://qiita-image-store.s3.amazonaws.com/0/165289/b9c53635-65f9-d80d-5285-bdcfa83303c1.png)

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

![NNCdeep_mlp_evaluate_step5.png](https://qiita-image-store.s3.amazonaws.com/0/165289/77d508a6-8c1c-6cbf-0a89-63c367bcccfb.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](https://qiita-image-store.s3.amazonaws.com/0/165289/af60a596-9d42-d775-121e-9a789c7025a8.png)

学習させてみると...

![NNCdeep_mlp_evaluate_step7.png](https://qiita-image-store.s3.amazonaws.com/0/165289/6a218aa9-5b44-6cf8-d056-a632f2bdb74e.png)

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

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

![NNCdeep_mlp_evaluate_step8.png](https://qiita-image-store.s3.amazonaws.com/0/165289/5d569385-0202-a5ff-ffc2-89898cdb6eca.png)

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

![NNCdeep_mlp_evaluate_dataset_detail.png](https://qiita-image-store.s3.amazonaws.com/0/165289/251390dd-27a9-73eb-ee46-8d1c54e83b6e.png)

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

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