Help us understand the problem. What is going on with this article?

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

More than 3 years have 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対応で記述できるので分かりやすいですね。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away