Fashion-MNIST を動かしてみる
(注)このデータはMNISTを少し複雑化することを意図したもので、衣服等の識別に使える種類のデータではない。あくまでもテストデータ。
今回はDockerを用いてKeras + Jupyterの環境を構築する。
Docker及びGitコマンドが使える環境であれば実行できるように記述したつもり。
事前準備
Dockerのインストール
https://www.docker.com/
実行環境
macOS Sierra 10.12.6
MacBook air early 2015
手順
Docker Keras をクローン
$ git clone https://github.com/gw0/docker-keras-full
$ cd docker-keras-full
Docker run
$ docker run -d -p=6006:6006 -p=8888:8888 gw000/keras-full
コンテナIDを取得
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
fb08017a810d gw000/keras-full "/bin/sh -c '/bin/..." 3 minutes ago Up 3 minutes 0.0.0.0:6006->6006/tcp, 0.0.0.0:8888->8888/tcp dreamy_clarke
取得した"CONTAINER ID" (上記では fb08017a810d )を記録
/bin/bashを実行してコンテナに接続
$ docker exec -it fb08017a810d /bin/bash
ログイン後、パスを確認
root@fb08017a810d:/srv# pwd
/srv
Fashion-MNISTをクローン
# git clone https://github.com/zalandoresearch/fashion-mnist
接続を終了
# exit
Jupyter notebookに接続
ブラウザで http://localhost:8888 を開く
(ログインパスワード: keras )
(参考URL:http://10001ideas.com/2017/08/30/fashion-mnist%E3%82%92keras%E3%81%A7cnn%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E5%88%86%E9%A1%9E%E3%81%97%E3%81%A6%E3%81%BF%E3%81%9F/)
(注)再実行する際はカーネルをリスタートすること
%matplotlib inline
import os
print(os.getcwd())
os.chdir('./fashion-mnist/')
from keras import backend as K
from utils.mnist_reader import load_mnist
from keras.layers.convolutional import Conv2D, MaxPooling2D
from keras.layers.core import Activation, Flatten, Dense
from keras.models import Sequential
from keras.utils import np_utils
from keras.initializers import Constant
from keras.optimizers import Adam
import matplotlib.pyplot as plt
#load_mnistはutilsにある
X_train, y_train = load_mnist('data/fashion', kind='train')
X_test, y_test = load_mnist('data/fashion', kind='t10k')
X_train = X_train.astype('float32') / 255
X_test = X_test.astype('float32') / 255
X_train = X_train.reshape(X_train.shape[0], 1, 28, 28)
X_test = X_test.reshape(X_test.shape[0], 1, 28, 28)
y_test = np_utils.to_categorical(y_test, 10)
y_train = np_utils.to_categorical(y_train, 10)
K.set_image_dim_ordering("th")
#LeNetを構築する
model = Sequential()
model.add(Conv2D(20, kernel_size=5, padding="same", input_shape=(1,28,28)))
model.add(Activation("relu"))
model.add(MaxPooling2D())
model.add(Conv2D(50, kernel_size=5, padding="same"))
model.add(Activation("relu"))
model.add(MaxPooling2D())
model.add(Flatten())
model.add(Dense(500))
model.add(Activation("relu"))
model.add(Dense(10))
model.add(Activation("softmax"))
model.compile(loss="categorical_crossentropy", optimizer=Adam(), metrics=["accuracy"])
history = model.fit(X_train, y_train, batch_size=128, epochs=20, verbose=1, validation_split=0.2)
score = model.evaluate(X_test, y_test, verbose=1)
print("Test score:", score[0])
print("Test accuracy:", score[1])
print(history.history.keys())
#グラフの表示
plt.plot(history.history['acc'])
plt.plot(history.history['val_acc'])
plt.title('model accuracy')
plt.ylabel('accuracy')
plt.xlabel('epoch')
plt.legend(['train', 'test'], loc='upper left')
plt.show()
plt.plot(history.history['loss'])
plt.plot(history.history['val_loss'])
plt.title('model loss')
plt.ylabel('loss')
plt.xlabel('epoch')
plt.legend(['train', 'test'], loc='upper left')
plt.show()