DeepRunning　～Level8～

#Level８．深層学習　ＤＡＹ４
##8-1.Section1) TensorFlowの実装演習
　　●TensorFlowについて
　　　•実務ではTensorFlowを活用することが多く、スクラッチで実装することは少ない。
　　　•TensorFlow、Keras、Pytorchの順。
　　　•TensorFlowはgoogleが作ったディープラーニングのフレームワークで、
　　　　調べる際もTensorFlowが多い。

　　●実装「constant」
　　　•TensorFlow ではテンソルというものを利用する。
　　　•Session.run() で起動しないと中身も確認できない。

![Day4_0001tensorflow.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/640632/332cbcf7-2b2d-a491-804b-a0e15cb9ed23.png)

　　●実装「placeholder」
　　　・placeholderは、箱のようなものを用意している。
　　　・placeholderは後から値を自在に変更できる。
　　　・feed_dictで配列のx番目の要素を渡す。
　　　　⇒xをバッチに渡して実行するときなどに使用する。

![Day4_0002tensorflow.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/640632/638f6d58-7f43-a4d7-c45a-325900cee245.png)

　　●実装「variables」
　　　・a = tf.constant(10)と定義するとaに10を設定する。
　　　・x = tf.Variable(1)後々に値を変えて更新できる。
　　　　⇒「calc_op = x * a」「update_x = tf.assign(x, calc_op)」
　　　　　で値を更新している。
　　　・init = tf.global_variables_initializer()は、
　　　　変数を初期化する。

![Day4_0003tensorflow.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/640632/168ed526-704f-1a68-939c-2c0b3536e5cf.png)

###8-1-2 線形回帰の実装演習
　　●matplotlibのjitterの仕様（1度目にプロットできない）
　　　matplotlibの下にinlineを書いてあげる。

　　●コード
　　　・iters_num　･･･何回学習するか。
　　　・plot_interval　･･･10回ごとに結果を表示する。
　　　・n = 100
　　　　x = np.random.rand(n)
　　　　d = 3 * x + 2　･･･100個のランダムなxを用意し、3*x+2の値を作る。
　　　・xは直線の値のため、noiseを加える。
　　　　⇒上下にまばらな値ができる。
　　　・train = optimizer.minimize(loss)　･･･誤差を最小化する学習。
　　　・loss = tf.reduce_mean(tf.square(y - dt))　･･･回帰二乗誤差
　　　・sess.run(train, feed_dict={xt:x_train,dt:d_train})
　　　　･･･trainを読み出し、feed_dictでx_train、d_trainを渡していく。
　　　・W_val：[3.0194452]、b_val：[1.9318823]となっており、
　　　　d = 3 * x + 2のW:3とb：2に近い予測値になっている。

　　●Tryの確認
　　　・noiseの値を変更しよう
　　　・dの数値を変更しよう

　　　noiseに0.55、bに9を設定する。
　　　⇒W：[3.0428321]、b：[8.961408]と予測された。
　　　　その他変更して試したが、noiseが大きいと上手く回帰できない。

![Day4_0004tensorflow.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/640632/80ffe5b7-ab97-86d7-a40f-6412e2971b2a.png)
![Day4_0005tensorflow.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/640632/6de56a99-c30b-bdc5-bbfb-dabfcc921def.png)
![Day4_0006tensorflow.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/640632/b3e1edb0-de8e-b094-f83f-962c069d1f47.png)
![Day4_0007tensorflow_tyr.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/640632/d640c245-b338-3208-f3e9-1e8aa02b5d60.png)

　　☆考察☆
　　　•noiseによるデータの作成で、直線上からどの程度ノイズを発生させるのか、
　　　実際のデータがない時に一般データとの差を考えるのも難しいと感じた。
　　　•Wとdがきちんと予測されると面白い。

###8-1-3 非線形回帰の実装演習
　　●非線形な一直線でない式を予測する。

　　●コード
　　　・「d = -0.4 * x ** 3 + 1.6 * x ** 2 - 2.8 * x + 1」
　　　　非線形な解を作成している。
　　　・Wが-0.4、1.6、-2.8、1と4つあるため、
　　　　WのVariableのoshapeを[4,1]と定義。
　　　・optimizer = tf.train.AdamOptimizer(0.001)に変更している。
　　　・[[-0.3990355]
　　　　 [ 1.6032437]
 　　　　[-2.8051274]
 　　　　[ 1.0001277]]　･･･4つのWがきちんと予測できている。

　　●Tryの確認
　　　・noiseの値を変更しよう
　　　・dの数値を変更しよう

　　　noiseを0.35にしてみた。
　　　⇒[[-0.36423665]
 　　　　[ 1.6244664 ]
 　　　　[-2.8141403 ]
　　　　 [ 0.96930456]]　･･･4つのWはほぼ予測ができている。
![Day4_0008tensorflow_tyr.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/640632/ac2e88ab-9dc0-4a96-5af8-d9dc474fb9f0.png)
![Day4_0009tensorflow_tyr.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/640632/7beefc47-dd7a-1259-2a5a-1da6a84fdc26.png)

　　　dを変更してみる。
　　　「d =  0.4 * x ** 3 + 2.8 * x ** 2 - 2.8 * x + 10」
　　　⇒[[ 0.31515315]
　　　　 [ 3.8476086 ]
 　　　　[-2.596497  ]
　　　　 [ 7.5793443 ]]　･･･ちょっと厳しかったようだ。
![Day4_0010tensorflow_tyr.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/640632/67531554-8c2d-5183-eb10-b9adfdc877c1.png)

　　☆考察☆
　　　•noiseを大きくしても線形回帰と比べてあまり分散しなくなるようだ。
　　　•dは線形回帰と比べても極端に予測がズレない。4つのWで複雑な非線形になると、
　　　平均二乗誤差の収束は難しくなるが、線形回帰より大きく外れないと思った。

　　●Tryの確認
　　　次の式をモデルとして回帰を行おう
　　　$𝑦=30𝑥^2+0.5𝑥+0.2$
 
　　　誤差が収束するようiters_numやlearning_rateを調整しよう
![Day4_0011tensorflow_tyr.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/640632/0f97ec9a-566e-e2bf-0c00-f32263b8d514.png)
![Day4_0012tensorflow_tyr.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/640632/b6b45c01-8ae9-dd39-6d73-b546601ccee9.png)
![Day4_0013tensorflow_tyr.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/640632/0ca4b7d0-e2ab-3459-3814-40947d43f2af.png)

　　☆考察☆
　　　・iters_numを30000～35000回くらいに設定しないと収束しなかった。
　　　　データ作成数を増やすなど、様々な試行錯誤は必要だと感じた。
　　　　「optimizer = tf.train.AdamOptimizer(0.01)」を0.001⇒0.01にする差が大きい。
　　　　⇒iters_numは25000回くらいで十分だった。

###8-1-4 分類1層（mnist）
　　●MNISTの分類
　　　　手書き文字のデータセットで、28×28×白黒データで1チャンネル。
　　　　0～9のどの数字かを予測する。

　　●Tryの確認
　　　次の式をモデルとして回帰を行おう
　　　・x：入力値, d：教師データ, W：重み, b：バイアス をそれぞれ定義しよう
![Day4_0014tensorflow_MNIST_try.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/640632/8865ff7b-a334-36b6-58e3-1630f2113bf2.png)
![Day4_0015tensorflow_MNIST_try.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/640632/db59943e-a523-98c5-5a52-2b05097353e7.png)

　　　・内容を確認する。
　　　　①x_batch[0]
　　　　②d_batch[0]
　　　　③x_batch[0].shape
　　　　④plt.imshow(x_batch[0].reshape(28,28))
![Day4_0016tensorflow_MNIST_try.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/640632/def4f77e-34da-e8ca-6b22-060e2e3326c6.png)
![Day4_0017tensorflow_MNIST_try.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/640632/9d43272f-8906-54d1-dc77-537e58198b28.png)
![Day4_0018tensorflow_MNIST_try.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/640632/df5d1afc-3614-dca7-99fd-535502734813.png)
![Day4_0019tensorflow_MNIST_try.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/640632/97990a1f-c575-e650-367d-326431b53ca2.png)

　　☆考察☆
　　　詳細はもう少し復習して深堀してみるが、
　　　1層で出力のsoftmax関数が出力する0～9の分類が87%の精度はすごいなと感じた。

###8-1-5 分類3層（mnist）
　　●MNIST1層より精度を上げる。
　　　・hidden_layerを2つ用意する。
　　　・784（入力）⇒600、600⇒300⇒10（個の出力）のニューラルネットワーク
　　　・隠れ層があるのでWやbを3つずつ用意。
　　　・TensorFlowでは毎回Variableを定義する必要がある。
　　　・Wが3つある場合：W1，W2，W3と、b1，b2，b3と定義する。
　　　・出力の前にドロップアウトしており、汎化性能を上げるため、
　　　　あるニューロンを消している。
　　　　「drop = tf.nn.dropout(z2, keep_prob)」

　　●Tryの確認
　　　隠れ層のサイズを変更してみよう（600、300）
　　　optimizerを変更しよう
![Day4_0020tensorflow_MNIST_try.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/640632/a22ec925-416b-c81d-2050-0e5ee148c1a9.png)
![Day4_0021tensorflow_MNIST_try.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/640632/407a0edc-1b46-9111-fb21-25384587dc45.png)
![Day4_0022tensorflow_MNIST_try.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/640632/359a13a6-fb8e-722b-c0f5-ad073feec918.png)
![Day4_0023tensorflow_MNIST_try.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/640632/cf6024aa-7876-61ac-de15-97c5d09f056e.png)
![Day4_0024tensorflow_MNIST_try.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/640632/056aa718-fe37-5290-9ccf-6711e170d253.png)
![Day4_0025tensorflow_MNIST_try.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/640632/97667f93-4e37-32d5-c39d-a0e0f8390bfc.png)

　　☆考察☆
　　　修正前の状態で90%となった。dropout_rate=0としたら91%となったが、
　　　過学習になってしまってのかもしれない。
　　　隠れ層のサイズを半分にしたところ、87%と精度が落ちた。
　　　逆に800、500と増やすと91%と少し向上する。増やせばいいものだろうか。
　　　⇒増やすと学習に時間がかかるようになった。
　　　optimizerは、AdaGradを試してみた。
　　　最終的な精度は90%だが、途中からの伸びが良かった。
　　　講義と同じように全種類試した。
![Day4_0026tensorflow_MNIST_try.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/640632/4269e685-5dee-f4e9-51ba-5ea8bc1eb389.png)

###8-1-6 分類CNN（mnist）
　　●Conb×pool×Conb×poolで、
　　　affin×dropout×affinという構造。
　　　・1層目でreshapeにより28×28×1チャンネルの画像として処理。
　　　・W_conb1は5×5×1×32というウェイト
　　　　5×5：CNNのフィルターサイズ
　　　　1×32：1チャンネルのものを32チャンネルに拡張する
　　　・padding='SAME'：shapeが変わらないようなpaddingを用意する。

　　●Tryの確認
　　　ドロップアウト率を0に変更しよう
![Day4_0027tensorflow_MNIST_try.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/640632/76c5e479-cebd-aa08-d23f-4f64ccfca3ce.png)
![Day4_0028tensorflow_MNIST_try.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/640632/8ac0efe8-3f98-fef0-3109-b9309c475e16.png)
![Day4_0029tensorflow_MNIST_try.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/640632/051d3137-439b-97b9-a444-ff3114b643d9.png)
![Day4_0030tensorflow_MNIST_try.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/640632/88d624ef-ae90-6263-83f4-7314337cfcbb.png)

　　☆考察☆
　　　ドロップアウト率が0.5の時は、93％の精度だった。
　　　ドロップアウト率を0にしたら、精度が91％と落ちた。
　　　ただ、90～96％をふらふらしており、学習モデルとしては安定していない印象。
　　　x_batchでトレーニングデータを渡したもので、汎化性能は不明。
　　　テストデータの場合、ドロップアウトさせた方が精度があがる。

###8-1-7 論文から実装する
　　●画像認識の最新モデルを実装するには？
　　　・VGG
　　　・AlexNet
　　　・GoogLeNet
　　　・Resnet
　　　・Yolo

　　　⇒・VGG16でarxivと検索するとarxivのサイトにて論文を参照でき、
　　　　　サイトから無料で手に入る。
　　　　・ABSTRACTを読む→ARCHITECTUREを見る。
　　　　　RESULTで精度がどうなったか確認する。
　　　　・表とかテキストで実装した組み合わせなどがまとめられている。
　　　　・VGGはブログの記事になっているものもある。
　　　　・コードがGitHubに載っているので参考にする。
　　　　・AlexNet等でもアーカイブがあり、構成図を参照したりする。
　　　　　「pytorch AlexNet」のように検索する。
　　　　・ResnetはDeep Residual Learning for Image Recognitionで、
　　　　　他と同じようにアーカイブがある。
　　　　・最新のものでなければ、既にあるものから実装する。
　　　　・物体認識（Yolo）もPDFで提供されているが、
　　　　　再現実装するのは大変だったりする。

###8-1-8 例題・例題解説
　　●例題１つ目
　　　解説なし
![Day4_0031_TEST.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/640632/195e1923-d90a-ece2-d7d8-e4861c4ee609.png)

　　●例題２つ目
　　　正解は(a）
![Day4_0032_TEST.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/640632/b2c0834c-e871-fffa-10b4-00340d944e1d.png)

　　●例題３つ目
　　　正解は(a）
![Day4_0033_TEST.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/640632/6db4822f-6e93-dbff-ce52-d9de661fafed.png)
　　　
　　●例題４つ目
　　　正解はあ：(a）、い：(a)、う：（a）
![Day4_0034_TEST.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/640632/fb1cc808-a260-cc83-0948-6ab2bc37e8a3.png)
![Day4_0035_TEST.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/640632/b535ba85-5482-a24c-4507-7812e499cab4.png)
![Day4_0036_TEST.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/640632/674ee38d-2ab0-8759-ef7f-9dbbdd80b98d.png)

　　●例題５目
　　　正解は(あ）
![Day4_0037_TEST.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/640632/cc890abc-39fa-3f64-c6ae-5d733e189398.png)

　　●例題６目
　　　正解は(a）
![Day4_0038_TEST.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/640632/dab62a84-d850-64d0-a300-0d10d291a563.png)

☆確認テスト☆
　　・8-1-8-1 VGG・GoogLeNet・ResNetの特徴をそれぞれ簡潔に述べよ。

　　【自分の回答】
　　　　VGG：16層と19層の構造のバージョンがある。勾配消失問題がある。
　　　　GoogLeNet：22層の構造。Inceptionモジュールが特徴。
　　　　ResNet：152層の構造。VGGの勾配消失問題を解決。

　　【解答】
　　　　VGG：最も古くて2014年のモデル。Convolution、Convolution、max_poolという
　　　　　　　単純なネットワークの積み重ねで出来ている。パラメータ数が多い。
　　　　GoogLeNet：Inception moduleを使ているのが特徴。1×1の畳み込みの次元削減。
　　　　ResNet：スキップコネクションアイデンティモジュールを使うことで残差接続を行い、
　　　　　　　　深い学習ができるという特徴。

###8-1-9 Keras1
　　●Kerasについて
　　　•TensorFlowのラッパーである。
　　　•初心者でも簡単に記述できる。
　　　•複雑なことを行う場合、TensorFlowを書かなければいけない。

　　●実装実習「線形回帰」
![Day4_0039_Keras.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/640632/7216d2a2-df27-38b8-70b2-5b9e419dbe27.png)
![Day4_0040_Keras.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/640632/94041a06-9919-1dd7-e1aa-2ac843e23685.png)
![Day4_0041_Keras.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/640632/5d15cc85-b0c0-ad63-1daa-e17696977de0.png)

　　●実装実習「単純パーセプトロン」
![Day4_0042_Keras.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/640632/2c3ba97d-f46d-d095-f069-0b0e0d2403a8.png)
![Day4_0043_Keras.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/640632/424ec755-087c-4010-749c-8f4e80555e03.png)
![Day4_0044_Keras.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/640632/202e0177-0566-fe91-6a34-3eddbd9ccc52.png)

　　●Tryの確認
　　　np.random.seed(0)をnp.random.seed(1)に変更
　　　エポック数を100に変更
　　　AND回路, XOR回路に変更
　　　OR回路にしてバッチサイズを10に変更
　　　エポック数を300に変更しよう
![Day4_0045_Keras_try.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/640632/dd0b259d-b521-b602-12b6-7a7fb120b889.png)
![Day4_0046_Keras_try.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/640632/c3e696c8-6863-bf89-eb31-1f736c2566b0.png)
![Day4_0047_Keras_try.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/640632/b1de0fc3-ed70-6aa2-5171-686adb468274.png)
![Day4_0048_Keras_try.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/640632/5d50f939-6c2f-ef9f-7f2d-8c6d0437651b.png)
![Day4_0049_Keras_try.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/640632/3315eece-c95f-6616-5a9c-b801c3ef19ad.png)
![Day4_0050_Keras_try.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/640632/3eb0ea6c-5753-2651-d3f3-b3910fca0d08.png)
![Day4_0051_Keras_try.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/640632/9731a613-b1c6-7c8b-323b-9f103eab3c3f.png)
![Day4_0052_Keras_try.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/640632/4d9d5896-e00f-d40d-2f27-8666e948eafb.png)
![Day4_0053_Keras_try.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/640632/d3158a87-865d-7c37-8c17-0a7c1cb60ee4.png)
![Day4_0054_Keras_try.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/640632/8508d40e-32a2-fd2a-6229-0cdd7cc864bf.png)
![Day4_0055_Keras_try.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/640632/d4a62521-e425-fd42-20a0-5c3215357300.png)
![Day4_0056_Keras_try.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/640632/e87f4cdd-31e9-60c6-decd-b8874fff3418.png)

　　☆考察☆
　　　単純なOR回路でもバッチサイズやエポック数によっては、
　　　正解率が100%にならないことがある。XOR回路は、
　　　ハイパーパラメータを変更してもロスが減らず不正解がある。
　　　OR回路は非線形のため、1層ではうまくいかない。

　　●実装実習「分類（iris）」

　　●Tryの確認
　　　中間層の活性関数をsigmoidに変更しよう
　　　SGDをimportしoptimizerをSGD(lr=0.1)に変更しよう

　　　ソースの修正が必要だった。
　　　# from sklearn.cross_validation import train_test_split
　　　⇒from sklearn.model_selection import train_test_split

　　　# plt.plot(history.history['acc'])
　　　# plt.plot(history.history['val_acc'])
　　　⇒plt.plot(history.history['accuracy'])
　　　⇒plt.plot(history.history['val_accuracy'])
![Day4_0057_Keras_try.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/640632/2f5dfecb-3099-d308-bab6-67208e5b1f7c.png)
![Day4_0058_Keras_try.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/640632/f7c19df6-08a0-e212-7ab3-e5ff70c7cbb1.png)
![Day4_0059_Keras_try.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/640632/5f41df7b-86ed-3cc8-46aa-4ec1bb151e16.png)
![Day4_0060_Keras_try.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/640632/dc6672a9-9644-46f0-8ddc-1ea4bbcfe0e3.png)
![Day4_0061_Keras_try.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/640632/dc869980-635b-8888-3473-d0d9e0523ced.png)
![Day4_0062_Keras_try.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/640632/fb093b16-a54c-a513-7455-ded9e1237b22.png)

　　☆考察☆
　　　sigmoid関数だと勾配消失を起こすので、
　　　ReLU関数の汎化性の良さはわかるが、irisデータだと分かりづらい。
　　　複雑なデータを扱った際に、それぞれ検証してみようと思う。

###8-1-10 Keras1

　　●実装実習「分類（mnist）」

　　●Tryの確認
　　　load_mnistのone_hot_labelをFalseに変更しよう (error)
　　　誤差関数をsparse_categorical_crossentropyに変更しよう
　　　Adamの引数の値を変更しよう
![Day4_0063_Keras.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/640632/f190db59-dabf-1e56-29d0-dfd2acefef90.png)
![Day4_0064_Keras.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/640632/758e8524-3ce1-6aa4-3c0e-9be9dab0d8b2.png)
![Day4_0065_Keras.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/640632/96776f10-306d-fef6-0bb3-2f6431f8cbec.png)

　　☆考察☆
　　　model.compileの指定方を修正しないと、上手く動作しなかった。
　　　コーディングのいけないところは、じっくり再確認する予定。
　　　one_hot_labelの設定と、誤差関数をsparse_categorical_crossentropy、
　　　categorical_crossentropyの指定方については間違えないようにする。

　　●実装実習「CNN分類（mnist）」

　　●Tryの確認
　　　実行に時間がかかるため割愛
![Day4_0066_Keras.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/640632/6b08eec6-a513-53e3-5867-34ee4c7caa0f.png)
![Day4_0067_Keras.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/640632/3812930b-0bfe-02c1-5692-30ecdd334c4f.png)
![Day4_0068_Keras.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/640632/e1c2c24b-3490-1f15-df0b-6df937ca6fab.png)

　　☆考察☆
　　　確かに処理に時間かかることが確認できた。
　　　padding=SAMEした時の動作比較検証は地道だが面白そう。
　　　多層のconvolutionについてもサイズを変更して確認してみる。

　　●実装実習「cifar10」

　　●Tryの確認
　　　実行に時間がかかるため割愛
![Day4_0069_Keras.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/640632/9195c537-ebdf-3ef8-3ef9-a076f12b858b.png)
![Day4_0070_Keras.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/640632/7865ff73-7265-3478-befb-0e8024a3c9d2.png)
![Day4_0071_Keras.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/640632/3ae305e3-b653-899c-b59b-4d9b2e969fc1.png)

　　☆考察☆
　　　50000枚のトレーニングデータ、10000枚のテストデータで、
　　　カラーの画像をRGBのため255で正規化している。
　　　割愛であるが、処理時間とコードの内容確認のため実施してみた。
　　　動画のように枚数を絞って実行すればよかった･･･｡

　　●実装実習「RNN」
　　　2進数足し算の予測
　　　Keras RNNのドキュメント https://keras.io/ja/layers/recurrent/#simplernn

　　●Tryの確認
　　　RNNの出力ノード数を128に変更
　　　RNNの出力活性化関数を sigmoid に変更
　　　RNNの出力活性化関数を tanh に変更
　　　最適化方法をadamに変更
　　　RNNの入力 Dropout を0.5に設定
　　　RNNの再帰 Dropout を0.3に設定
　　　RNNのunrollをTrueに設定
![Day4_0072_Keras.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/640632/ed6a7d9d-482e-0cbe-aec1-f34c61f4ddba.png)
![Day4_0073_Keras.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/640632/c9c40ca9-f75b-68c6-ff25-e55e93ad5e80.png)
![Day4_0074_Keras.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/640632/b825902b-5fc0-4e70-057e-0a44cf230c34.png)
![Day4_0075_Keras.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/640632/47678c75-6c48-bb04-7ff9-bc5597f916f1.png)
![Day4_0076_Keras_try.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/640632/833a5bce-6b1d-a87f-ff0c-b47a5b5c7ff1.png)
![Day4_0077_Keras_try.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/640632/f7596f81-8264-3d78-0981-a1accbba197c.png)
![Day4_0078_Keras_try.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/640632/791b9b4a-f338-bb2d-726b-3618b6e1d11e.png)
![Day4_0079_Keras_try.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/640632/33e49b00-0249-214a-7005-651c1cc5d71b.png)
![Day4_0080_Keras_try.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/640632/f8cdc569-0953-c9a7-28f8-4430debf0178.png)
![Day4_0081_Keras_try.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/640632/2238c9db-72d0-0be7-70e1-41db8c5e0595.png)
![Day4_0082_Keras_try.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/640632/e289b32d-4b7f-4ac3-9b60-05f104c89585.png)
![Day4_0083_Keras_try.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/640632/e1f4c5d7-1a14-e409-7de5-5490a6596d9e.png)
![Day4_0084_Keras_try.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/640632/2ea0931c-4b1a-f3ad-72a7-119037648caf.png)
![Day4_0085_Keras_try.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/640632/f4a6a3de-00b2-f13a-4373-06cf22e3373b.png)

　　☆考察☆
　　　※BGMがうるさ過ぎて解説の声がすごく聞きづらい。。。
　　　KerasでRNNの実装はすごく楽である。
　　　sigmoidは精度が出ない。状況に応じて使い分けるのは計算させてみてだろうか。
　　　RNNの出力活性化関数をtanhにしたところ、直ぐに収束し精度が良い。 
　　　KerasならsimpleRNNから様々なRNNのネットワークに切替えが可能。
　　　Kerasは容易に扱える印象であるが、やはりTensorflowで組めるようにしておきたい。

##8-2.Section1) 強化学習
###8-2-1 強化学習とは
　　●強化学習とは
　　　長期的に報酬を最大化できるように環境の中で行動を選択
　　　できるエージェントを作ることを目標とする機械学習の一分野。
　　　⇒行動の結果として与えられる利益（報酬）により、
　　　　行動を決定する原理を改善していく仕組み。
　　　　教師あり学習や教師なし学習とは違った分野。

　　　・マーケティングの応用例
　　　　プロフィールと購入履歴からキャンペーンメールを顧客に送付するソフト。
　　　　行動：顧客ごとに送信、非送信の行動を選択。
　　　　報酬：キャンペーンのコスト（負の報酬）、
　　　　　　　生み出されると推測される売り上げ（正の報酬）を受ける。

☆確認テスト☆
　　・8-2-1-1 強化学習に応用できそうな事例を考え、
　　　　　　　環境・エージェント・行動・報酬を具体的に挙げよ。

　　【自分の回答】
　　　環境：コンビニ等の共通したポイントカード導入箇所
　　　エージェント：ポイントの蓄積・ポイント利用の履歴により、
　　　　　　　　　　利用者還元セールやポイント10倍Dayなどを開催する。
　　　行動：顧客のポイントカード利用履歴から、ポイントを還元する、
　　　　　　通常よりポイントを上乗せしてもよいか選択する。
　　　報酬：ポイント還元・上乗せによる負の報酬と、
　　　　　　還元セールや上乗せにより購入が増えると推測される正の報酬。

　　【解答（例）】
　　　ゲームやボードゲーム
　　　プレイヤーが指す手についての強化学習

###8-2-2 探索と利用のトレードオフ
　　●探索と利用のトレードオフ
　　　環境について事前に完璧な知識があれば、
　　　最適な行動を予測し、決定することは可能である。

　　　⇒どの顧客にキャンペーンメールを送付すると、どの行動するか既知である。
　　　　（そんなことはそうそうない。）

　　　⇒強化学習の場合、そのような仮定は成り立たないとする。
　　　　不完全な知識を元に行動しながらデータ収集し、最適な行動を探索する。

　　●問題になるのは・・・
　　　探索と利用のトレードオフである。

　　　「過去のデータで、ベストとされる行動のみを常に取り続ければ、
　　　　他にもっとベストな行動を見つけることができない。」
　　　　（探索が足りない状態）
　　　　　　　↑
　　　　　トレードオフの関係性
　　　　　　　↓
　　　「既知の行動のみ常に続ければ、過去の経験が活かせない」
　　　　（利用が足りない状態）

　　　どちらの状態も良くなく、トレードオフを上手く調整することが必要。

###8-2-3 強化学習のイメージ
　　●強化学習のイメージ
　　　エージェントがある方策を実施して行動した状態sとなる。
　　　　⇒それを観測し、状態sの報酬価値を受け取る。
　　　という流れ。
![Day4_0086_reinforcementlearning.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/640632/d6668a2f-6219-2780-9944-b0fcca940d88.png)
![Day4_0087_reinforcementlearning.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/640632/0dc1a4e2-a9ce-ac9a-d418-8c5314f52ad8.png)

　　●関数
　　　方策：方策関数 Π(s,a)で表される。
　　　行動や価値V：行動価値関数 Q(s,a)で表される。

###8-2-4 強化学習の差分
　　●強化学習と、通常の教師あり／教師なし学習との違い

　　　【結論】目標が違う
　　　　・教師あり／なし学習では、データに含まれるパターンを見つけ出す、
　　　　　及び、そのデータから予測することが目標
　　　　・強化学習では、優れた方策を見つけることが目標

###8-2-5 強化学習の歴史
　　●強化学習について
　　　冬の時代があったが、計算速度の進展により大規模な状態を持つ場合でも、
　　　強化学習を可能としつつある。⇒ AlphaGo など

　　●Ｑ学習
　　　行動価値関数を、行動するごとに更新することで学習を進める方法

　　●関数近似法
　　　価値関数や方策関数を関数近似する手法のこと

###8-2-6 行動価値関数
　　●行動価値関数とは
　　　価値を表す関数としては、状態価値関数と行動価値関数の2種類がある。

　　　⇒ある状態の価値に注目：状態価値関数
　　　　状態と価値を組み合わせた価値に注目：行動価値関数

　　●Ｑ学習
　　　行動価値関数を行動のたびに更新することで学習している。

###8-2-7 方策関数
　　●方策関数とは
　　　方策ベースの強化学習手法において、
　　　ある状態でどのような行動を採るのかの価値を与える関数のこと。

　　　⇒この状態であれば、この行動をとる確率が◎◎％といったもの。

###8-2-8 方策勾配法
　　●方策反復法
　　　方策をモデル化して、最適化する手法
　　　$θ^{(t+1)}=θ^{(t)}+ε∇J(θ)$

　　●Ｊとは
　　　方策の良さである。
　　　⇒定義しなければならない。

　　●定義方法
　　　・平均報酬：行動をとった時に生まれる価値全部の平均
　　　・割引報酬和：カッコになればなるほど報酬の加算する割合を減らす（減衰）

　　　⇒定義に対応して、行動価値関数 Q(s,a)の定義を行い、
　　　　方策勾配定理が成り立つ。

```math
$∇_θJ(θ)=\mathbb{E}_{π_θ}[(∇_θlogπ_θ(a|s)Q^π(s,a))]$
```

　　　⇒Ｑ関数を使って上記のように定義している。

　　●例題解説
![Day4_0088_reinforcementlearning.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/640632/817a3b86-30d2-533b-e790-a11863897c75.png)
　　　正解は(a)
　　　方策をアップデートするのが方策勾配に基づくアルゴリズムである。

　　　方策勾配定理は基本的には下記の２式から導出される。
　　　・状態価値関数　v(s) = sum_a (π(a|s)Q(s,a))
　　　・ベルマン方程式　Q(s,a) = sum_s’(P(s’|s,a)[r(s,a,s’) + γV(s’)]

###8-2-9 論文解説DCGAN
　　●DCGAN
　　　・Deep Convolutional Generative Adversarial Networksという名前。
　　　・CNNのディープなネットワークを使って敵対的学習により画像を生成する。
　　　・例として、実際に存在しないベッドルームの画像をきれいに出力している。
　　　・潜在空間でベクトルとして表現したものからGenerator部分の画像を生成するため、
　　　　「笑顔の女性の顔」から「普通の女性の顔」を引いて、「男性の顔」を足し合わせる。
　　　　⇒「笑顔の男性の顔」を数式的に扱うことができる。
　　　・Generatorの生成部分はランダムな100個の正規分布の値を使って画像生成している。
　　　　⇒生成画像と実際の画像を比較し、Discriminatorというモデルが、
　　　　　その画像が作られたものかを判定する。

　　●例題演習１
![Day4_0089_reinforcementlearning.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/640632/76efb77d-959c-4624-a7c1-3bd307552363.png)
　　　正解は(a)0.5

　　●例題演習２
![Day4_0090_reinforcementlearning.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/640632/09da2491-a4b4-e37e-1d35-202f60651fab.png)
　　　正解は(a)

　　●例題演習３
![Day4_0091_reinforcementlearning.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/640632/32ecf43d-8f04-d1c2-69d4-14b5b38dad08.png)
　　　正解は(a)

###8-2-10 Kaggleについて
　　●Kaggle
　　　・データ分析のコンペティション
　　　・データ分析・AIにおいての世界大会のようなものである。
　　　・Googleが運営している。
　　　・企業等が賞金を出している。
　　　・日本人でも上位に入るチームがある。
　　　・Kaggleへの登録方法。サイトに行けば登録できる。
　　　・コンテスト参加迄の一連の流れ
　　　・Researchが研究目的。
　　　・Featuredが賞金があるコンテスト。
　　　・titanicやmnistなどの初心者向けのコンペがある。
　　　　（データセットが有名なため、不正が発生？順位があてにならない）
　　　・Kernelsで世界のデータサイエンティストの実装を参照できる。 
　　　・参加した後の流れ
　　　　よさそうなスコアのものや説明を読んだり、コピーして動かしてみたり、
　　　　データの水増しのやり方を覚えたりすると良い。
　　　・コンペではDiscussionもあるので、知見としてアイディアが共有される。
　　　　有意義な議論があり、とても参考になる。
　　　　KernelやDiscussionを見てみると良い。
　　　・失敗談
　　　　どのコンテストに出るかが難しい。
　　　　⇒データセットとタスクの見極め等
　　　　　データセットの容量が少ないものに出てみるとか、
　　　　　mnistなどGPUを必要としないものに出てみる等。
　　　　Gitを使えれば良いが、スクリプトの管理が難しい。
　　　　管理がごちゃごちゃになる。
　　　　⇒適当に管理しているといけないのでフォルダで管理する。
　　　・自分一人で頑張ろうとして順位が上がらず、モチベーション低下する。
　　　　Kernelを使いこなして参加することで維持できる。
　　　・上位入賞するには、特徴量のパターンが出てきた時に、
　　　　1000個と5000個では5000個の方が良い精度が出るので、
　　　　時間があれば実践を増やすといい。
　　　　シングルモデルは難しく、多数のモデルでアンサンブルが良い。
　　　　色々な特徴量を用意して、精度を上げていく。
　　　　⇒最後にアンサンブルで多様性を出す。

###8-2-11 実践につながるインプット
　　●学習のやり方
　　　プログラミングの習得⇒機械学習
　　　スクリプトベースの学習
　　　Kaggleでの実践⇒実務に活かす。
　　　論文の読み込み。
　　　データ分析やAIはKaggleが良い。