Posted at

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

More than 1 year has passed since last update.


概要

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_mnist_cnn_mini.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はモデルとプログラムを1:1対応で記述できるので分かりやすいですね。