LoginSignup
24
26

More than 5 years have passed since last update.

[Keras/TensorFlow] KerasでCV(クロスバリデーション)

Last updated at Posted at 2017-05-03

目的

ゼロからKerasとTensorFlow(TF)を自由自在に動かせるようになる。
そのための、End to Endの作業ログ(備忘録)を残す。
※環境はMacだが、他のOSでの汎用性を保つように意識。
※アジャイルで執筆しており、精度を逐次高めていく予定。

環境

  • Mac: 10.12.3
  • Python: 3.6
  • TensorFlow: 1.0.1
  • Keras: 2.0.2

To Do

Keras導入編

Keras(Tensorflow)の環境構築
KerasでMINSTの学習と予測
KerasでTensorBoardの利用
Kerasで重みファイルの保存/読み込み
Kerasで自前データの学習と予測
Kerasで転移学習

学習のテクニック編

KerasでCV(クロスバリデーション)<---いまココ
Kerasの学習のオプションの確認
Kerasでパラメータチューニング(グリッドサーチ etc)
Kerasで画像の水増し
Kerasで学習過程の可視化
Kerasで事前学習

参考

概要

https://github.com/fchollet/keras/blob/master/examples/mnist_mlp.py
にあるMINSTのサンプルファイルをCVに書き換える。
sklearnを利用したが、もっと簡単の方法があるのではないかと考えてる。

sklearnのStratifiedKFoldの利用

minst_cv.py
import keras
from keras.datasets import mnist
from keras.models import Sequential
from keras.layers import Dense, Dropout
from keras.optimizers import RMSprop
from sklearn.model_selection import StratifiedKFold
import numpy

# number for CV
fold_num = 5 

batch_size = 128
num_classes = 10
epochs = 1

# fix random seed for reproducibility
seed = 7
numpy.random.seed(seed)

# load dataset
(x_train, y_train), (x_test, y_test) = mnist.load_data()
x_train = x_train.reshape(60000, 784)
x_test = x_test.reshape(10000, 784)
x_train = x_train.astype('float32')
x_test = x_test.astype('float32')
x_train /= 255
x_test /= 255

# y_train = keras.utils.to_categorical(y_train, num_classes)
y_test = keras.utils.to_categorical(y_test, num_classes)

# input data
X = x_train
Y = y_train


# define X-fold cross validation
kfold = StratifiedKFold(n_splits=fold_num, shuffle=True, random_state=seed)
cvscores = []

for train, test in kfold.split(X, Y):
    # create model
    model = Sequential()
    model.add(Dense(512, activation='relu', input_shape=(784,)))
    model.add(Dropout(0.2))
    model.add(Dense(512, activation='relu'))
    model.add(Dropout(0.2))
    model.add(Dense(10, activation='softmax'))

    model.compile(loss='categorical_crossentropy',
              optimizer=RMSprop(),
              metrics=['accuracy'])

    # Fit the model
    model.fit(X[train], keras.utils.to_categorical(Y[train], num_classes),
                    batch_size=batch_size,
                    epochs=epochs,
                    verbose=1)


    # Evaluate
    scores = model.evaluate(X[test], keras.utils.to_categorical(Y[test], num_classes), verbose=0)
    print("%s: %.2f%%" % (model.metrics_names[1], scores[1]*100))
    cvscores.append(scores[1] * 100)

print("%.2f%% (+/- %.2f%%)" % (numpy.mean(cvscores), numpy.std(cvscores)))

実装のポイントとしては、MINSTは10種類の文字のマルチクラス分類問題であり、デフォルトのスクリプトではkeras.utils.to_categorical(y_train, num_classes)y_trainは(60000,)から(60000,10)に変換されてしまう。
一方でkfold.splitの入力では(60000,)でないとエラーになる。
そこで、一度データを入力してからkeras.utils.to_categorical(Y[train], num_classes)を利用するよう書き換える。

実行

python minst_cv.py

以下の結果が表示される。1エポックを5回実行したことが確認できる。

Epoch 1/1
47995/47995 [==============================] - 10s - loss: 0.2773 - acc: 0.9152      
acc: 96.22%
Epoch 1/1
47998/47998 [==============================] - 12s - loss: 0.2696 - acc: 0.9164      
acc: 95.78%
Epoch 1/1
48000/48000 [==============================] - 11s - loss: 0.2701 - acc: 0.9169      
acc: 96.28%
Epoch 1/1
48003/48003 [==============================] - 9s - loss: 0.2705 - acc: 0.9181       
acc: 95.61%
Epoch 1/1
48004/48004 [==============================] - 11s - loss: 0.2759 - acc: 0.9149      
acc: 96.40%
96.06% (+/- 0.31%)

カラー画像の場合

入力がRGBの場合。

執筆中

24
26
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
24
26