Fashion-MNIST を docker+keras+jupyter で 動かしてみた

# Fashion-MNIST を動かしてみる
https://github.com/zalandoresearch/fashion-mnist

（注）このデータはMNISTを少し複雑化することを意図したもので、衣服等の識別に使える種類のデータではない。あくまでもテストデータ。

今回はDockerを用いてKeras + Jupyterの環境を構築する。
Docker及びGitコマンドが使える環境であれば実行できるように記述したつもり。

## 事前準備
Dockerのインストール
https://www.docker.com/

## 実行環境
macOS Sierra 10.12.6
MacBook air early 2015

## 手順
https://github.com/zalandoresearch/fashion-mnist

#### 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 ）

* "fashion-mnist"フォルダが有ることを確認
![fashion-mnist_1.png](https://qiita-image-store.s3.amazonaws.com/0/5557/9927098c-38ba-34cd-3dcf-560356f953d4.png)

* "New から Python 3"を選択し、ノートブックを作成
![fashion-mnist_2.png](https://qiita-image-store.s3.amazonaws.com/0/5557/abd17c9a-0f91-4172-1080-5d2505cd4253.png)

* コードを貼り付けて実行
![fashion-mnist_3.png](https://qiita-image-store.s3.amazonaws.com/0/5557/fd326fef-9574-c680-2dc6-19ec06cc9107.png)

（参考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/）
（注）再実行する際はカーネルをリスタートすること

```python
%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()
```

### 実行結果 （20エポック実行した結果）
![fashion-mnist_4.png](https://qiita-image-store.s3.amazonaws.com/0/5557/b7fdda96-3e5d-b249-32b5-63bd3c827f7c.png)