[TensorFlow] Keras on TensorFlow はじめの一歩

# 概要
Keras, TensorFlowをインストールし、MNISTのCNNを実行してみます。

# Keras
Kerasはニューラルネットワークを簡単に記述できるPythonのライブラリです。バックエンドは、TensorFlowとTheanoに対応しています。2016/9にリリースされたver.1.1.0からデフォルトのバックエンドがTensorFlowになりました。

# 構築する環境
+ AWS EC2 t2.micro
+ Ubuntu Server 16.04 LTS (HVM), SSD Volume Type - ami-0567c164
+ Python: 3.5.2
+ TensorFlow: 0.12
+ Keras: 1.1.1

# Python環境のインストール
※ Python 3.5.2 は最初からインストールされています。

```
$ sudo apt-get -y update
$ sudo apt-get -y install python3-pip python3-dev
```

# TensorFlowのインストール

```
$ export TF_BINARY_URL=https://storage.googleapis.com/tensorflow/linux/cpu/tensorflow-0.11.0-cp35-cp35m-linux_x86_64.whl
$ sudo -H pip3 install --upgrade $TF_BINARY_URL
```

TensorFlowの動作チェック

```
$ python3 /usr/local/lib/python3.5/dist-packages/tensorflow/models/image/mnist/convolutional.py
```

# Kerasのインストール

```
$ sudo -H pip3 install keras

$ sudo apt-get -y install graphviz
$ sudo -H sudo pip3 install pydot-ng
$ sudo -H sudo pip3 install h5py
```

graphvizとpydot-ngは、モデルを画像出力するのに使います。
h5pyは、HDF5フォーマットの情報を入出力するのに使います。

■ **Kerasの動作チェック**

examplesの[mnist_cnn.py](https://github.com/fchollet/keras/blob/master/examples/mnist_cnn.py)を実行してみます。

```
$ python3 mnist_cnn.py
Using TensorFlow backend.
Downloading data from https://s3.amazonaws.com/img-datasets/mnist.pkl.gz
15286272/15296311 [============================>.] - ETA: 0sX_train shape: (60000, 28, 28, 1)
60000 train samples
10000 test samples
Train on 60000 samples, validate on 10000 samples
Epoch 1/12
60000/60000 [==============================] - 214s - loss: 9.1101 - acc: 0.4070 - val_loss: 6.9043 - val_acc: 0.57                       02
Epoch 2/12
60000/60000 [==============================] - 214s - loss: 7.7077 - acc: 0.5201 - val_loss: 5.0885 - val_acc: 0.68                       33
Epoch 3/12
60000/60000 [==============================] - 214s - loss: 6.8004 - acc: 0.5765 - val_loss: 4.1852 - val_acc: 0.73                       90
Epoch 4/12
60000/60000 [==============================] - 219s - loss: 5.8370 - acc: 0.6363 - val_loss: 3.7302 - val_acc: 0.7668
Epoch 5/12
60000/60000 [==============================] - 220s - loss: 5.2334 - acc: 0.6739 - val_loss: 3.0775 - val_acc: 0.8081
Epoch 6/12
60000/60000 [==============================] - 219s - loss: 5.0515 - acc: 0.6850 - val_loss: 3.4284 - val_acc: 0.7862
Epoch 7/12
60000/60000 [==============================] - 219s - loss: 4.8637 - acc: 0.6966 - val_loss: 2.7935 - val_acc: 0.8254
Epoch 8/12
60000/60000 [==============================] - 219s - loss: 4.6540 - acc: 0.7101 - val_loss: 2.7168 - val_acc: 0.8302
Epoch 9/12
60000/60000 [==============================] - 254s - loss: 4.4473 - acc: 0.7227 - val_loss: 2.7631 - val_acc: 0.8280
Epoch 10/12
60000/60000 [==============================] - 716s - loss: 4.3329 - acc: 0.7299 - val_loss: 2.8391 - val_acc: 0.8232
Epoch 11/12
60000/60000 [==============================] - 2250s - loss: 4.2979 - acc: 0.7322 - val_loss: 2.5995 - val_acc: 0.8378
Epoch 12/12
60000/60000 [==============================] - 2137s - loss: 4.3999 - acc: 0.7259 - val_loss: 2.5785 - val_acc: 0.8392
Test score: 2.57848101082
Test accuracy: 0.8392
```

■ **モデルを画像出力**
Kerasは構築したmodelをplot()で画像出力できます。

```
from keras.utils.visualize_util import plot
plot(model, show_shapes=True, show_layer_names=True, to_file='model.png')
```

`mnist_cnn.py`はこんなモデルです。

![model_mnist_cnn_mini.png](https://qiita-image-store.s3.amazonaws.com/0/107056/dc405d4d-10cd-1eaf-283f-58e7299a3a40.png)

対応するプログラムはこちら。

```
model.add(Convolution2D(nb_filters, kernel_size[0], kernel_size[1], border_mode='valid', input_shape=input_shape))
model.add(Activation('relu'))
model.add(Convolution2D(nb_filters, kernel_size[0], kernel_size[1]))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=pool_size))
model.add(Dropout(0.25))
model.add(Flatten())
model.add(Dense(128))
model.add(Activation('relu'))
model.add(Dropout(0.5))
model.add(Dense(nb_classes))
model.add(Activation('softmax'))
```

Kerasはモデルとプログラムを１：１対応で記述できるので分かりやすいですね。