DNN_後編2 (演習結果と考察)

#深層学習4-2 Jupyter演習　（Section1：TensorFlowの実装演習）
[4_1_tensorflow_codes]....基本部分
#####【演習実施結果】
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435761/fd3c7068-0f24-5065-f980-a85fcb16a58a.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435761/8b438ae8-c607-ebcc-a669-236c71b658d3.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435761/03bc59a0-d747-5322-6cec-74350bb5ae94.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435761/a87f1a93-6b3c-0e6b-13ab-bb081b7508d6.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435761/0b7b753d-f616-eb3a-3ab8-75940b2b067e.png)

#####【考察】
・TensorFlowの定数や変数についての書き方を演習した。
・constantやplaceholderの使い方、variablesで変数の値を次々に更新させていくなどを行った。
・Session()をしないと、処理が実行されないなど、numpyとは作法が異なる。


#深層学習4-3 Jupyter演習　（Section1：TensorFlowの実装演習）
[4_1_tensorflow_codes]....線形回帰
#####【演習実施結果】
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435761/eb89a055-fe52-0385-16b5-82024a0905a7.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435761/325de64c-9f4a-ec1d-1e6b-6c0296b8bb64.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435761/aa841f86-9d27-4d03-35f1-70c42016756a.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435761/9e33a68d-f6ba-d24a-6ae9-e1b21731cd26.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435761/d4951703-429e-b52a-0922-e3977810ef45.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435761/f23d6bc8-b31c-5002-7ae3-92ebb178a225.png)

#####【考察】
・単純な線形回帰をTensorFlowを使って学習を行った。
・正解値の直線の式や、ノイズを変えて結果がどうなるのか確認した。
ノイズについては、0.3→3などに、ノイズを大きくすると、正解データのちらばりが大きくなるため、上手く学習出来なくなる（データが一本の直線上付近に収まらなくなるため）。
直線の式については、直線の傾きが急なほど、データの散らばりがすくなるため、結果のグラフを見ると、上手く直線上にデータが乗っているのが確認出来た。
　傾きが緩いと、ちらばりが大きくなるため、グラフを見た感じは、線形では上手く学習出来ない事が分かる(但し、理論値の直線の式に対しては、おおむね正解の値に近い値が学習されている事が分かる)。



#深層学習4-4 Jupyter演習　（Section1：TensorFlowの実装演習）
[4_1_tensorflow_codes]....非線形回帰
#####【演習実施結果】
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435761/984d0d10-798a-46ff-3136-af414b6f5645.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435761/20855f36-34c4-f7e6-e193-9eb772417941.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435761/f3e295ee-9a92-0181-1268-e462e9e27d91.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435761/93a20a25-42ec-aed4-b289-57a169a61454.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435761/a7fcbd4a-4b96-2eaf-6592-64d3c32b9b67.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435761/69b2090c-6bb8-4f1d-8e23-fec814576e47.png)

#####【考察】
・基本的な流れは、線形回帰の時と同じになっている。
・今度は曲線なので、重みの数が次数分加えて学習を行った。
・今度は最適化は、勾配降下法ではなく、Adamを使っている。
・線形回帰の時と同様、訓練データに散らばりが少なければ、比較的正しい値を学習するが、線形の時よりも、学習する重みの数が増えて、式が複雑になるため、線形の時ほど、きれいに正解値に近づかない時もある。


#深層学習4-5 Jupyter演習　（Section1：TensorFlowの実装演習）
[4_1_tensorflow_codes]....演習問題
#####【演習実施結果】
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435761/035394f2-01f4-845a-aba8-5aafd44be4a8.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435761/a80aec2b-640d-e8b1-0237-4cb88656e92f.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435761/563804fd-4473-e9e1-8033-28f589115d06.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435761/a60d6810-ce14-feed-c547-7aa7d103e6be.png)

#####【考察】
・4-4で行った非線形回帰をもとにコーディングを行った。
・上手く収束するように、訓練回数や学習率などを変えながら試行錯誤して、フィットするモデルを作成する事が出来た。
　訓練モデルが同じ構造でも、訓練回数や微妙な学習率の違いで、上手くフィットしたり、しなかったりする事が体感出来た。



#深層学習4-6,7 Jupyter演習　（Section1：TensorFlowの実装演習）
[4_1_tensorflow_codes]....MNIST1,2
#####【演習実施結果】
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435761/66e73e31-2e8e-91f4-ebbe-663f9af270ef.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435761/cfd96aa2-90f4-6a97-6a8a-fc27792f16a4.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435761/a9bba191-f91d-69a2-66f1-0b03a63f82d7.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435761/9a8ceefb-9bdf-b7df-f654-3a8f4a0edeca.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435761/77b9a8c2-424e-f036-ea20-32bae0e99dfd.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435761/b3502e99-c5d5-f392-02d6-eba21d3b9a31.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435761/c4e0506b-4539-8ebd-bbca-d5a0f2da6f9b.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435761/faa2fe9b-b014-bcbe-2989-a51c1e8f2a72.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435761/afd628c3-4583-10df-7e77-0aab915cda68.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435761/1a7d5797-7447-186d-d89a-c839b3c8e1ed.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435761/86368833-319b-d3b5-9eaa-379b1122783a.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435761/68a7d663-b251-fb14-62fc-1a84384ac4b4.png)

#####【考察】
・1層の単純なNNでも、MNISTで86％程度の精度は出た。
・これまではtensorFlowで回帰タスクを行ったが、今回は分類タスクを行った。
・分類の場合、出力が連続値ではないので、最後のグラフを表示させる時は、
回帰の時のように、データ点のプロット+訓練後の学習曲線ではなく、
訓練回数と正解率のグラフになっている。Xが右側に行くに従って訓練回数が増えている。
Yが上に行くに従って、精度が上がっている。

・3層のNNにしたところ、1層の時よりも精度は上がった、最適化手法などが上手く設定出来ていないと、1層の時よりも精度が悪くなる事もあった。
・3層のNNで、中間層のノードの数を600x300　→ 1000x800 にしてみたところ、精度が90.4%→91.7%に向上した。
　ただノード数の数に比例して精度が上がった、という感じはしない。若干上がった程度。
・ノード数や層数は単純に増やすと精度は良くなる傾向にあるが、学習に時間が掛かる。逆にノード数や層数を少なくすると、学習に掛かる時間は短くなるが、精度は下がる傾向にある。精度と速度のトレードオフを考えながら、調整していく必要がある。



#深層学習4-7,8 Jupyter演習　（Section1：TensorFlowの実装演習）
[4_1_tensorflow_codes]....MNIST2, MNIST3
#####【演習実施結果】
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435761/b2679a0d-9e2d-4356-68c7-70f634a2d22a.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435761/3b5ad98c-188d-4b3c-46ab-dfa530369ef2.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435761/f7f5701c-0d34-148b-cb36-c6bebd708c63.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435761/30c1351a-8db1-75d5-7d59-70dff91acd8f.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435761/cf6fd38b-8e70-00bb-451e-5411128fe33b.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435761/ce977085-bb23-a96b-fb9f-ac4afb300ad2.png)

#####【考察】
・CNNで訓練したところ、繰り返し回数は300回と少なかったが、先ほど3層のNNで300回訓練した時よりも、良い精度が出た（ドロップアウト：0.5で95%程度）。
・tensorFlowでは、畳み込み処理や最大プーリングの関数が用意されているので、簡単に実装出来る事が分かった。numpyでは、関数を定義して演習を行っていたが、tensorFlowを使う事で、容易に実装が出来る。
・またパディングの処理も’SAME’を引数として与えてあげることで、元の画像サイズから変更せずに、出力が出来る。
・ドロップアウト0.5→0.0にしても精度はさほど変わらなかったが、0.9にすると一気に10%以上精度が落ちた(95%→83%)。
・今回、訓練データで精度を測ったため、ドロップアウトあり/なしでそれほど精度に差は出なかったが、
一般的には、ドロップアウトがある事で、汎化性能が上がるので、テストデータで比較した場合は、ドロップアウトがある方が精度が上がる可能性がある。


#深層学習4-12 Jupyter演習　（Section1：TensorFlowの実装演習）
[4_3_keras_codes]....Keras
#####【演習実施結果】
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435761/47b0a7fb-3e3b-84f4-20f0-6d4fedfc948c.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435761/105ef795-6f56-d5b2-057d-8415c089eae9.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435761/50f4e737-e46d-b12c-1da7-67a2d3de48d2.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435761/c53ee719-ba23-fdec-550b-77bf9b202da1.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435761/3dfea31d-19ff-aa9c-2f02-2a746aba0ba0.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435761/f4f21319-8afe-3980-2736-e1ec893c7540.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435761/4682bc9d-4791-26d4-994c-3fc3e8a7775f.png)

#####【考察】
・Kerasを使うと、重みのW,bやx,yについてplaceholderを用意しなくてもいい。Variablesで変数を定義する必要がない。
それによりコードがシンプルになって、見やすくなっている。
・手法の部分は、model.compile(loss='mse', optimizer='sgd')などと出来て、引数を変えるだけで、誤差関数や最適化手法を簡単に変更する事が出来る。
・訓練時にmodel.fit(X, T, epochs=30, batch_size=1)などと出来て、繰り返し回数も引数に入れる事で、for文を使わずに訓練を行う事が出来て、ソースが見やすくなる。



#深層学習4-13 Jupyter演習　（Section1：TensorFlowの実装演習）
[4_3_keras_codes]....Keras2
#####【演習実施結果】
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435761/343ae434-5704-ac0a-5195-869aa88f89a0.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435761/5ae91246-1493-0be4-156c-5b73d9211a25.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435761/f64a0b81-9d40-9118-611c-3c7c6b0be8ca.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435761/2670807c-824e-fb51-6ab8-c7f3b804c98e.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435761/7792cfc4-878b-103d-5722-558cb15bc304.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435761/b62d2a7e-f6fb-7892-dd8a-0ed127fd7c72.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435761/8663730f-4179-93e1-9916-f71c71820b2b.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435761/07f66b7d-f70b-5e08-7f2f-89e1164cf54e.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435761/faac2c80-808e-62fc-7c23-991cc49aaab0.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435761/04d1cb99-7178-e6d8-c3c9-7834b4b7bf33.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435761/9a5dd22a-9ac0-2631-193d-ac641143d1c0.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435761/c7e64f1c-8002-3106-0024-caf259263486.png)

#####【考察】
・random.seedで乱数を固定すると、毎回同じlossが出てきて、固定されている事が確認出来る。
初期値を変える事で、学習の結果も変わってくる。
乱数を固定する事で、現象の再現やモデルの比較する時に評価しやすくなる。
・エポックを30→100に変更すると、ロスが0.27→0.16に下がって、学習が進んだ事が確認出来た。
さらにエポック数を300にすると、0.07までロスが下がった。
・XORについては、単純パーセプトロンでは理論上分類出来ないが、実際にエポック数を大きくして訓練させても、学習が進んでいない事が確認出来た。
・XORでも、単純パーセプトロンではなく、中間層を作って、ノードの数を10程度にして、中間層の活性化関数をReLUにすると、非線形なXORのような分類も上手く学習出来た。
・バッチ数(batch_size)を入れる事で、1回の学習に掛かる時間が少なるなる事が確認出来た。
バッチ数が1の場合は、1回の学習に1ミリ秒程度掛かっていたが、
同じ条件でバッチ数を10にすると、1回の学習が500マイクロ秒と、学習に掛かる時間が少なく済んだ。
・バッチサイズについては、一般的には、2の累乗で設定する(2, 4, 8, 16, 32, 64, 128,..)。
理由は、GPUを使う時には、2の累乗が一番GPUの性能を出す事が出来るため。
　サイズの値については、データ数が少ない時は、バッチサイズは小さく、
　データ数が多い時は、バッチサイズは大きめに設定する（データ数が多い時に、バッチサイズを小さくしてしまうと、1回に掛かる学習時間が大きくなってしまうため）。



#深層学習4-14 Jupyter演習　（Section1：TensorFlowの実装演習）
[4_3_keras_codes]....Keras3
#####【演習実施結果】
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435761/9c40a5bf-c48a-aff2-ad68-144c2511d9be.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435761/93835657-e39d-7b52-b496-b460e4e78c2d.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435761/56d73d92-ae18-e962-9984-4204dbe133de.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435761/a8c5f624-2c47-9559-f199-e183012eb96e.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435761/254822d8-8594-a159-8b9a-4bc5abd14374.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435761/3dd9ebed-3fbb-4008-8a97-5da29a9af17b.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435761/bd7c3706-7a33-0a79-7081-88f327f5dd02.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435761/7e91b384-1346-45c9-82c6-2caee2c2d6d1.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435761/0e20c4ef-2749-85bb-b7a8-dd654e3129c2.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435761/9755f73d-c2ae-259f-6985-8d2dd9c6020b.png)

#####【考察】
・中間層の活性化関数でReLUとシグモイドを比較したところ、講師の結果ではシグモイドの方が精度が出たが、自分の方で試すと、ReLUの方が良い結果になった。訓練データの分割によっても結果が変わる事が考えられる。
　基本的に層が深くなればなるほど、シグモイドでは0～1の値なので、勾配消失になる可能性が高い。
・Kerasでは、optimizerの設定値を調整する場合、該当するoptimizerをimportしないと、デフォルトのままでしか使えない。今回tryのところで、importして、SGDの学習率を初期値の0.01→0.1に変更してみた。
・SGDの学習率を0.01→0.1に10倍にしたことで、早い段階で学習精度が高くなった事が確認出来た。



#深層学習4-15 Jupyter演習　（Section1：TensorFlowの実装演習）
[4_3_keras_codes]....Keras4
#####【演習実施結果】
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435761/930118c3-7769-5452-8b6b-d9393d8b107b.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435761/9a58dc1d-142f-b95a-1d44-da4ca9a75cbd.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435761/9726cde8-0850-a50a-fdb8-f216834353f8.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435761/953c2d70-8cdc-f760-4b38-51d87907761e.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435761/103a8eec-2f1b-e41a-8a42-8b7058382931.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435761/5e45394f-8cd1-afd3-e557-6a0fee15ce1c.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435761/101b43aa-37a2-5482-6370-1895874ed7c5.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435761/d6cd3cb9-5794-9a8e-6f65-1932c93831ac.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435761/ff8b2d46-8d91-b657-ae55-bbde6186ba2c.png)

#####【考察】
・784->512->512->10の全結合NNでMNISTデータセットで訓練した。
・60000枚の画像で、次元数は28x28と非常に小さい画像で、ネットワークも中間層が2つと非常に単純なもので訓練したが、学習には、数分掛かった。今回CPUで計算を行ったが、GPUだともっと早くなる。
・テストデータに対しては、99.5%程度の精度が出た。テストデータについても、98.5%程度の精度が出て、CNNではないが、それなりに良い結果になった。
・データのラベルをone_hot_label=Falseにすると、正解の値が、カテゴリではなく、正解の数値そのものになるため、このままのモデル構造では学習させる事が出来なかった（1次元の数値）。
　このような時は、前のirisデータセットの時に使ったように、loss関数にsparse_categorical_crossentropyを使うと分類を行う事が出来る(irisの時は、0,1,2の3つの数値のいずれかだった)。
　結果については、one_hot_label=trueの時と同等の精度が出た。
・Kerasを使うと、Adamなどの設定値が簡単に設定出来て比較実験を簡単に行う事が出来る。


#深層学習4-16 Jupyter演習　（Section1：TensorFlowの実装演習）
[4_3_keras_codes]....Keras5
#####【演習実施結果】
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435761/c2afac65-6c45-dfb4-db80-11380e00e877.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435761/e97c03f9-7995-5868-b73e-51b23ea3d59d.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435761/5663a467-742b-63cd-3192-b90f6d227ee7.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435761/387330d9-0beb-c008-d8c7-755668dfb9c5.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435761/c64890e2-7413-71e3-530e-013f81adeb82.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435761/977419ec-9b81-676e-3e35-52f2fe5d8578.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435761/b2b99852-3c6b-afef-97f0-b329bdc65dcd.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435761/4ee87cfe-17c3-353f-8bb7-059b0394c9c0.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435761/0ec9aa6f-538a-ca12-65ab-49feeac8341c.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435761/2525db30-e177-1a65-96d4-111d59f888c9.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435761/9f92856a-a1f0-91cf-e570-a08bd56da9f2.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435761/63805fd0-734b-94b0-b294-c15d42d1ba53.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435761/577922ce-c533-6e57-9055-121c7ee3a73f.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435761/37384043-ee40-0427-ec5f-5f19c52c00e2.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435761/32971cb2-3d35-d9b7-458d-d079556dfb8d.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435761/30a3912b-ce94-9eaa-1948-0896b82a0bd5.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435761/72a11653-6484-2ccd-8391-b71831a2ab85.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435761/45408747-1062-1868-1f9f-18dbf8299d8a.png)

#####【考察】
<font color="Red">__CNN：__</font>
デフォルトでは、下記のような構造のCNNになっている。
input(28ｘ28) 
-> conv(26x26x32) 
-> conv(24x24x64) 
-> pool(12x12x64) 
-> affine(9216) 
-> affine->(128) 
->output(10)
・Kerasでは、Conv2D, MaxPooling2Dが用意されていて、2D画像の畳み込みやプーリングが簡単に実装出来るようになっているので、CNNを実装しやすい。
・TensorFlowでは、画像のサイズを気にしながら実装していたが、Kerasでは入力さえ間違えなければ、後はshapeがおかしくならなければ、自動でshapeを計算してくれるので、実装しやすい。
・演習では計算時間が掛かってしまうため、データ数を正規の60000ではなく、かなり削減した1000で行ったが、それでも90%以上の精度が出た。
・VGG16なども、コピペで出来るレベルではないが、仕組みを理解して少し工夫をすれば、比較的簡単に実装出来る事が分かった。

<font color="Red">__CIFAR-10データセット：__</font>
飛行機や車とかのクラスについて画像が用意されている（10クラス）。
32x32で、各クラス6000枚(合計60000枚)用意されている(訓練50000枚、テスト10000枚)。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435761/741147a7-6e58-0d67-bfed-cf09f323205e.png)
・model.save()で、訓練後のモデルを保存しておいて、後から訓練後のモデルを呼び出して使う事が出来る。
実際の現場では、学習済みモデルを、このように保存しておいて、保存した学習済みモデルを使って評価する事が多い。
・NNで汎化性能が出ない場合は、BatchNormalizationを加える事が良くある。
　実際に今回試してみたところ、バッチ正規化なしでは、23%くらいだったか、バッチ正規化を入れると37%くらいになって精度が向上した。



#深層学習4-17, 18 Jupyter演習　（Section1：TensorFlowの実装演習）
[4_3_keras_codes]....Keras6、Keras7
#####【演習実施結果】
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435761/5a0b60d0-facc-6ef8-2150-0748659f17a5.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435761/7f0ae289-f7b6-b8d2-a9dd-03164317f89e.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435761/672f0558-3976-0be1-0df1-5880e602e181.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435761/dcb79268-a2fe-15f1-62c6-d3c426ab5ad2.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435761/fe6ffb1c-1b3a-dca5-8ae6-35d3489a8018.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435761/7237f538-76e9-05a8-135f-825bd0ca77ac.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435761/1c4f5226-699e-4972-61b2-22de1fcf4df7.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435761/696a17ac-c38f-249d-a568-4373e69d2967.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435761/553e9da8-f166-442b-bdb7-c39a35b0cd48.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435761/a0d3ac22-82fe-3829-0730-e43d32a5a249.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435761/b8fc43ea-6960-4a9b-b9a9-3f004c6a48b9.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435761/aea16dd5-f9c9-1e33-10e8-09e14e100dde.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435761/c56218ce-1f38-3185-7863-33b2c7584484.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435761/08e02f1c-1d78-2e63-db5a-d4cbcf42f099.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435761/1e1e4127-ac3c-84f2-c4f7-b562e28e2437.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435761/6c228b89-f55d-7548-579c-7e36bf7adc0a.png)

#####【考察】
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435761/0c748ae8-545d-56fd-1f05-19615e4667bc.png)
・KerasにはRNNについての関数も用意されていて、簡単に実装が出来るようになっている。シンプルなRNNだけではなく、GRUやLSTMなどもある。
・Kerasを使う事で、RNNの出力層のノード数なども、引数で簡単に変更する事が出来る。
・ノード数を16→128に増やしたところ、計算速度は遅くなったが、精度は、92%→100%に上昇して、表現力が上がった事が確認出来た。
・活性化関数をReLU→Sigmoidに変えたところ、精度は92%→80%と、今回のデータでは余り学習が進まなかった。
・活性化関数をReLU→tanhに変えたところ、精度は92%→100%と、今回のデータでは精度が上がった。
・最適化をSGD→Adamに変えたところ、精度は92%→100%と、今回のデータでは精度が上がった。
・RNNに入力ドロップアウト0.5を入れると、精度は92%→63%と、今回のデータでは余り学習が進まなかった。
　ドロップアウトについては、汎化性能を上げる反面、ランダムで一部のノードを不活性化するので、その分、学習の収束スピードが落ちる事になる。
・RNNに再帰ドロップアウト0.3を入れると、精度は92%→98%と、今回のデータでは精度が上がった。
・RNNのunrollをTrueにしたところ、精度は92%→92%と、今回のデータでは精度が上がった。
　unrollについては、Trueにすると、メモリ集中傾向になるが、スピードは上がるようなパラメータになる。
　短い系列にのみ適しているパラメータになる。今回のデータは8系列と短いので、パラメータの説明通り、上手く学習が進んだ。
・SimpeRNNの部分を、GRUやLSTMに書き換えて、あとは引数の調整をするだけで、GRUやLSTMも簡単に実装が出来る事が分かった。