概要
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を実行してみます。
$ 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.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はモデルとプログラムを1:1対応で記述できるので分かりやすいですね。