Google colaboratoryを試してみる（Keras ＆ MNIST）

無料で高性能なGPUが使える！とのことなので、触ってみました。

とりあえず、動くことを確認するのが目的なので、シンプルなKerasのネットワークとMNISTデータセットを使用します。

# colaboratoryでまずは設定

colaboratoryにアクセスしたところ、すぐにノートが書ける状態になった。

さらに、元々プライベートでGoogle Driveの安いプランを使っていたので、自動的にそちらに保存される模様。

やった設定としては、ノートを新規で作成して、「編集」→「ハードウェア アクセラレータ」をGPUに変更したのみ。

手軽さがやばい。

# Kerasのコードを書いてみる

ノートブックはPython2.7を選択。（3系でも動かせそうな気もするものの、念のため）

ノートのhinterland的な機能の有効化の仕方がわからなかったため、Azure Notebooksで先に書いて、それを持ってくる形で対応。（入力候補が無いと書きづらい・・）

```py3
from keras import backend as K
from keras.models import Sequential
from keras.layers.convolutional import Conv2D
from keras.layers.convolutional import MaxPooling2D
from keras.layers.core import Activation
from keras.layers.core import Flatten
from keras.layers.core import Dense
from keras.datasets import mnist
from keras.utils import np_utils
from keras.optimizers import Adam
import numpy as np
```

```
Using TensorFlow backend.
```

```py3
INPUT_SHAPE = (1, 28, 28)
CLASSES_NUM = 10
EPOCH_NUM = 20
BATCH_SIZE = 128
K.set_image_dim_ordering('th')
```

```py3
model = Sequential()

model.add(
    Conv2D(filters=20, kernel_size=5, padding='same',
           input_shape=INPUT_SHAPE))
model.add(Activation('relu'))
model.add(
    MaxPooling2D(pool_size=(2, 2), strides=(2, 2)))

model.add(
    Conv2D(filters=50, kernel_size=5, padding='same'))
model.add(Activation('relu'))
model.add(
    MaxPooling2D(pool_size=(2, 2), strides=(2, 2)))

model.add(Flatten())
model.add(Dense(500))
model.add(Activation('relu'))

model.add(Dense(units=CLASSES_NUM))
model.add(Activation('softmax'))
```

```py3
(x_train, y_train), (x_test, y_test) = mnist.load_data()

x_train = x_train.astype('float32')
x_test = x_test.astype('float32')
x_train /= 255
x_test /= 255
```

```py3
x_train.shape
```

```
(60000, 28, 28)
```

```py3
x_train = x_train[:, np.newaxis, :, :]
x_test = x_test[:, np.newaxis, :, :]
y_train = np_utils.to_categorical(
    y=y_train, num_classes=CLASSES_NUM)
y_test = np_utils.to_categorical(
    y=y_test, num_classes=CLASSES_NUM)
```

```py3
model.compile(
    loss='categorical_crossentropy', optimizer=Adam(), metrics=['accuracy'])
history = model.fit(
    x=x_train, y=y_train, batch_size=BATCH_SIZE,
    epochs=EPOCH_NUM, verbose=2, validation_split=0.2)
```

```
Train on 48000 samples, validate on 12000 samples
Epoch 1/20
 - 7s - loss: 0.1897 - acc: 0.9428 - val_loss: 0.0642 - val_acc: 0.9813
Epoch 2/20
 - 6s - loss: 0.0475 - acc: 0.9851 - val_loss: 0.0459 - val_acc: 0.9862
Epoch 3/20
 - 6s - loss: 0.0317 - acc: 0.9899 - val_loss: 0.0428 - val_acc: 0.9877
Epoch 4/20
 - 6s - loss: 0.0225 - acc: 0.9930 - val_loss: 0.0354 - val_acc: 0.9903
Epoch 5/20
 - 6s - loss: 0.0168 - acc: 0.9945 - val_loss: 0.0373 - val_acc: 0.9908
Epoch 6/20
 - 6s - loss: 0.0137 - acc: 0.9952 - val_loss: 0.0323 - val_acc: 0.9911
Epoch 7/20
 - 6s - loss: 0.0087 - acc: 0.9972 - val_loss: 0.0429 - val_acc: 0.9891
Epoch 8/20
 - 6s - loss: 0.0094 - acc: 0.9967 - val_loss: 0.0343 - val_acc: 0.9923
Epoch 9/20
 - 6s - loss: 0.0088 - acc: 0.9968 - val_loss: 0.0379 - val_acc: 0.9910
Epoch 10/20
 - 6s - loss: 0.0067 - acc: 0.9977 - val_loss: 0.0336 - val_acc: 0.9913
Epoch 11/20
 - 6s - loss: 0.0033 - acc: 0.9990 - val_loss: 0.0499 - val_acc: 0.9890
Epoch 12/20
 - 6s - loss: 0.0048 - acc: 0.9984 - val_loss: 0.0434 - val_acc: 0.9897
Epoch 13/20
 - 6s - loss: 0.0062 - acc: 0.9981 - val_loss: 0.0358 - val_acc: 0.9914
Epoch 14/20
 - 6s - loss: 0.0052 - acc: 0.9982 - val_loss: 0.0426 - val_acc: 0.9904
Epoch 15/20
 - 6s - loss: 0.0063 - acc: 0.9979 - val_loss: 0.0435 - val_acc: 0.9905
Epoch 16/20
 - 6s - loss: 0.0044 - acc: 0.9985 - val_loss: 0.0383 - val_acc: 0.9929
Epoch 17/20
 - 6s - loss: 0.0028 - acc: 0.9992 - val_loss: 0.0473 - val_acc: 0.9907
Epoch 18/20
 - 6s - loss: 0.0019 - acc: 0.9994 - val_loss: 0.0423 - val_acc: 0.9917
Epoch 19/20
 - 6s - loss: 0.0021 - acc: 0.9994 - val_loss: 0.0489 - val_acc: 0.9906
Epoch 20/20
 - 6s - loss: 0.0060 - acc: 0.9981 - val_loss: 0.0397 - val_acc: 0.9922
```

特につまづくことなく動いた。

# 感想

- 手軽すぎてやばい。
- 以前、古いPCに緊張しながらGPUを差したり、WindowsをUbuntuにしたりしていていたのは何だったのか・・
- そして、新しいPCではTensorflowインストールだったり、GPUの環境的なエラーに悩まされることが多かったのが、何もつまづくことなくストレートにディープラーニングが動いた。
- colaboratoryすごい。