Keras入門は家を出る前の5分で済ませよう

# はじめに
この記事では、Kerasの大まかな使い方を一通り把握することを目標としています。

# 目次
• Kerasとは
• ライブラリのインポート
• モデルの作成
　・Sequential
　・Flatten
　・Dense
　・Dropout
• モデルの訓練課程の設定
　・compile
• モデルの訓練
　・fit
• モデルの評価
　・evaluate

# Kerasとは
Kerasは、迅速な実験を可能にすることに重点を置いて開発されたもので、[TensorFlow](https://github.com/tensorflow/tensorflow)または[CNTK](https://github.com/Microsoft/cntk)、[Theano](https://github.com/Theano/Theano)上で実行可能な高水準のニューラルネットワークライブラリです。

<div align="center">
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/627290/c3590839-c179-abcf-eef1-aa214724cc49.png"
 width=600px>
</div>
(⇨"https://ja.wikipedia.org/wiki/Keras")

# ライブラリのインポート

```python:qiita.py
import keras
from keras.datasets import mnist
from keras.models import Sequential
from keras.layers import Flatten, Dense, Dropout
```
※今回はデータセットとしてmnistを採用しています。

# モデルの作成
```python:qiita.py
model = Sequential()
model.add(flatten(引数))
model.add(Dense(引数))
model.add(Dropout(引数))
```
※もちろんモデル作成は、Flatten,Dense,Dropoutが一つということはなく、いくつもの層を付け加えていきます。Flatten,Dense,Dropuoutの引数については下記で触れています。

## Flatten
Flattenは入力を平滑化するモジュールです。
以下に、Flattenの引数を示します。

### input_shape
input_shapeは、入力の形を指定するものです。
例えば、(784,)と書かれている場合、入力は(28,28)となります。この場合、784個のドットがあり、一つのドットに一つの数値が適用されます。つまり、今回の場合、784次元のデータを扱っています。

## Sequential
<div align="center">
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/627290/4d9f5895-bd08-7f9d-2111-acc58acea9f3.png
" width=600px>
</div>

Sequential(線形)というのは、網状の複雑なニューラルネットワークを簡略化したものです。Sequentialモデルは、layer(レイヤー)と呼ばれるニューロン(パーセプトロン)の塊によって一列につながっています。

## Dense
Denseは、ニューラルネットワークの層の形状のうち『全結合層』を表現出来るものです。全結合層とは、その層内の全てのニューロンが次の層の全ニューロンと接続するものを言います。
以下に、Dense作成時の引数を示します。

### units
unitsは、その層から出力される次元数を表すものです。つまり、Denseでいうところのニューロン数と言えます。

### activation
activationは、活性化関数を指定するものです。活性化関数とは何かというと、その層の出力刺激量を計算する関数を文字列で指定するものです。デフォルトでは、線形活性化:(a(x)=x)が設定されています。詳しくは以下を参照してください。
⇨ [深層学習の活性化関数]
(https://qiita.com/kuroitu/items/73cd401afd463a78115a)

---
この他の、Dense作成時の引数は以下を参照してください。
⇨ [Dense作成時の引数]
(https://keras.io/ja/layers/core/)

---
## Dropout
Dropoutは、全結合層との繋がりをどのくらい無効化するかを指定するものです。これを指定することにより、過学習を予防することができます。

# モデルの訓練過程の設定
```python:qiita.py
model.compile(引数)
```
以下に、compileの引数を示します。

### optimizer
optimizerは、最適化アルゴリズムを指定するものです。詳しくは、以下を参照してください。
⇨ [深層学習の最適化アルゴリズム](https://qiita.com/ZoneTsuyoshi/items/8ef6fa1e154d176e25b8)

### loss
lossは、損失関数を指定するものです。
損失関数とは何かというと、予測したものと正解の間にどのくらいの誤差が存在するかを計算するものです。詳しくは、以下を参照してください。
⇨ [深層学習の損失関数]
(https://mj-vitag.com/contents/?p=227)

### metrics
metricsは、評価関数を指定するものです。
評価関数とは何かというと、モデルの性能を図るために使われるものです。詳しくは、以下を参照してください。
⇨ [深層学習の評価関数]
(https://qiita.com/kou2kkkt/items/9a947111800555ebc6ef)

---
この他の、モデルの訓練課程における引数は以下を参照してください。
⇨ [compileの引数]
(https://keras.io/ja/models/model/)

---
# モデルの訓練
```python:qiita.py
model.fit(x_train, y_train, 引数)
```
以下に、fitの引数を示します。
### batch_size
batch_sizeは、一回に計算するデータの数を言います。これを小さくすることで、使用するメモリを少なくすることが出来ますが、計算回数が多くなってしまうという欠点があります。つまり、バッチサイズは『ちょうどいい具合に』選んでやる必要があります。

### epochs
epochsは、学習する回数を指定するものです。
こちらも回数が少ないと、十分に訓練データを学習することが出来ませんが、あまりに多いとか学習を引き起こします。こちらも『ちょうどいい具合に』選んでやる必要があります。

batch_size、epochsを『ちょうどいい具合に』と言われても難しいと思うので、参考までに以下を参照してください。
⇨ [batch_size、epochsの決め方]
(https://qiita.com/kenta1984/items/bad75a37d552510e4682)

---
この他の、モデルの訓練における引数は、以下を参照してください。
⇨ [fitの引数]
(https://keras.io/ja/models/model/)

---
# モデルの評価
```python:qiita.py
model.evaluate(x_train, y_train, 引数)
```

以下に、evaluateの引数を示します。
### verbose
verboseは、進行状況の表示モードを指定するものです。0=表示なし、1=プログレスバーを指定します。

---
この他の、モデルの評価における引数は、以下を参照してください。
⇨ [evaluateの引数]
(https://keras.io/ja/models/model/)

---

#おわりに
Kerasについて大まかにではありますが、まとめてみました。
Kerasは、引数の扱いが難しく、理解しづらいですが、この記事が何かの役に立てば幸いです😌

#参考文献
・https://github.com/tensorflow/tensorflow
・https://github.com/Microsoft/cntk
・https://github.com/Theano/Theano
・https://keras.io/ja/layers/core/
・https://keras.io/ja/models/model/
・https://mj-vitag.com/contents/?p=227
・https://qiita.com/kuroitu/items/73cd401afd463a78115a
・https://qiita.com/ZoneTsuyoshi/items/8ef6fa1e154d176e25b8
・https://qiita.com/kou2kkkt/items/9a947111800555ebc6ef
・https://qiita.com/kenta1984/items/bad75a37d552510e4682