Keras 3分間クッキング

# Keras 3分間クッキング
ディープラーニング・フレームワークは多々ありますが、その中でも特に人気なのがTensorflowとKerasだと思います。
https://keras.io/

Githubのスター数で他のフレームワークが10Kに届かないなか、Tensorflowが77.7K、次いでKerasが21.7Kと健闘しています。

Tensorflow等、他のフレームワークだとコードが長くなる、書き辛いという方でも、KerasはPythonさえ使えればすぐ書き始められるようにシンプルな記述が特徴です。
KerasはTensorflow、CNTK、Theanoをバックエンドにしてニューラルネットワークをプログラミングできるハイレベル・フレームワークです。
書き方は以下のようになっており、`model`にニューラルネットワークのレイヤーを一つ一つ重ねていくように書いていきます。

##### Kerasのニューラルネットワーク例
```python

model = Sequential()
model.add(Dense(512, activation='relu', input_shape=(784,)))
model.add(Dropout(0.2))
model.add(Dense(512, activation='relu'))
model.add(Dropout(0.2))
model.add(Dense(10, activation='softmax'))

```

これで以下を表現しています。
1. 入力値が784個の1次元
2. 隠れ層1で512個のニューロンがあり、活性化関数relu
3. 隠れ層1でドロップアウト率0.2
4. 隠れ層2で512個のニューロンがあり、活性化関数relu
5. 隠れ層2でドロップアウト率0.2
6. 出力値は10個で、活性化関数softmax

とても直感的でわかりやすいと思います。

Keras自体でニューラルネットワークのロジックを持っているわけではありません。
Kerasの中でTensorflowやCNTKを呼び出して使う仕組みになっています。
デフォルトのバックエンドはTensorflowで、好みによってCNTKやTheanoに変更可能です。

この記事では、KerasのインストールからKerasによるニューラルネットワークのトレーニングと評価までを3分間で実行してみたいと思います。

## 環境
環境は以下を事前にセットアップ済みとします。
・AWS EC2
・m4.xlarge (4vcpu, 16GB RAM)
・CentOS7.3
・Python3.5、pip、Jupyter Notebook、その他[Anacondaぽいもの](https://www.continuum.io/downloads)インストール済み

環境も整ったことで、Keras3分間クッキングをスタートしましょう。
以下の手順を上から流していけば3分でゴールします。
プログラムはJupyter Notebookで実行します。
インターフェイス（画面）が変わると時間ロスになるので、Kerasのインストール含めてJupyter NotebookでPythonで実行できるようにしました。

コード全文は以下になります。
https://github.com/shibuiwilliam/KerasIn3Minutes

## Kerasのインストール
インストールは以下で済みます。

```python

import os
os.system('pip install keras tensorflow')

```

KerasとTensorflowのインストールが完了します。
所要時間は約8.4秒でした。

![0.PNG](https://qiita-image-store.s3.amazonaws.com/0/55384/7396f926-1e13-fc4c-40c7-91cd97f12601.png)


## Kerasを使ってみる
いよいよKerasを使ってみましょう。
以下のプログラムでデータをロードし、ニューラルネットワークを定義し、トレーニング、テストデータによる評価までを行います。
データはMNISTを使います。
まずはライブラリをインポートし、データを用意しましょう。

```python
import keras
from keras.datasets import mnist
from keras.models import Sequential
from keras.layers import Dense, Dropout
from keras.optimizers import RMSprop

batch_size = 128
num_classes = 10
epochs = 20

# the data, shuffled and split between train and test sets
(x_train, y_train), (x_test, y_test) = mnist.load_data()

x_train = x_train.reshape(60000, 784)
x_test = x_test.reshape(10000, 784)
x_train = x_train.astype('float32')
x_test = x_test.astype('float32')
x_train /= 255
x_test /= 255
print(x_train.shape[0], 'train samples')
print(x_test.shape[0], 'test samples')

# convert class vectors to binary class matrices
y_train = keras.utils.to_categorical(y_train, num_classes)
y_test = keras.utils.to_categorical(y_test, num_classes)

```

MNISTのデータはKerasが内部データとして用意していますので、それをロードします。
MNISTの入力データを正規化し、ラベルデータをone hot表現に変換します。

ここまでで約10.3秒です。

![1.PNG](https://qiita-image-store.s3.amazonaws.com/0/55384/4be4f24a-51c1-1536-6fa1-28f1fd9d6bee.png)


続いてニューラルネットワークを定義します。

```python
model = Sequential()
model.add(Dense(512, activation='relu', input_shape=(784,)))
model.add(Dropout(0.2))
model.add(Dense(512, activation='relu'))
model.add(Dropout(0.2))
model.add(Dense(num_classes, activation='softmax'))

model.summary()

```

最初に`model = Sequential()`変数を定義し、そこにニューラルネットワークのレイヤーを一つ一つ重ねていく書き方をします。
各レイヤーでニューロンの数や活性化関数を定義します。
最後に`model.summary()`で作ったニューラルネットワークを表示することができます。

![2.PNG](https://qiita-image-store.s3.amazonaws.com/0/55384/0248e127-215f-b718-e200-8977265e59f3.png)

これで約10.5秒経過、3分まで残り170秒です。

いよいよニューラルネットワークでトレーニングです。
ニューラルネットワークのもっとも時間がかかる処理がトレーニングです。
トレーニングでニューラルネットワークはMNISTの画像データに書かれている数字を判別することができるようになります。

```python
model.compile(loss='categorical_crossentropy',
              optimizer=RMSprop(),
              metrics=['accuracy'])

batch_size = 128
epochs = 20
history = model.fit(x_train, y_train,
                    batch_size=batch_size,
                    epochs=epochs,
                    verbose=0,
                    validation_data=(x_test, y_test))

```

・・・長いトレーニングが完了しました。
トレーニングして画像に書かれた数字を判定できるようになったニューラルネットワークで、テストデータを判定し結果を評価します。
テストデータのLossが約0.11、Accuracyが98％という結果になりました。
ここまでで経過時間は185秒、ほぼ3分です。

![4.PNG](https://qiita-image-store.s3.amazonaws.com/0/55384/198ea00a-8e62-7047-9031-e4fbf2df4060.png)


###　以上、Keras3分間クッキングでした。