前回作成した訓練用データを使ってサル・イノシシ・カラスを見分ける画像認識プログラムを作成する
#kerasとは
Kerasは,Pythonで書かれた,TensorFlowまたはCNTK,Theano上で実行可能な高水準のニューラルネットワークライブラリです.
#ソースコード
##インポート
from keras.models import Sequential
from keras.layers import Conv2D, MaxPooling2D
from keras.layers import Activation, Dropout, Flatten, Dense
from keras.utils import np_utils
import keras
import numpy as np
##メイン関数
おおまかな流れは以下の通り:
- 前回保存した
animal.npy
を読み込む - 訓練用データを訓練関数に渡してモデルを作成
- 作成したモデルを評価関数に渡して分類精度を検証
classes = ["monkey", "boar", "crow"]
num_classes = len(classes)
image_size = 50
def main():
X_train, X_test, y_train, y_test = np.load("./animal.npy", allow_pickle=True)
X_train = X_train.astype("float") / 256
X_test = X_test.astype("float") / 256
y_train = np_utils.to_categorical(y_train, num_classes)
y_test = np_utils.to_categorical(y_test, num_classes)
model = model_train(X_train, y_train)
model_eval(model, X_test, y_test)
・X_train
, X_test
を256で割っているのは、正規化(データを0~1の範囲にしている)。
・to_categorical
は、[0, 1, 2]
という配列を
[[1, 0, 0]
[0, 1, 0]
[0, 0, 1]]
というように、正解のindexにのみ1が入っており、その他の場所には0が入っている配列に変換する。
##訓練
以下のコードの34行目以降を参考にする
参考:https://github.com/keras-team/keras/blob/master/examples/cifar10_cnn.py
def model_train(X, y):
model = Sequential()
model.add(Conv2D(32, (3,3), padding='same', input_shape=X.shape[1:]))
model.add(Activation('relu'))
model.add(Conv2D(32, (3,3)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Dropout(0.25))
model.add(Conv2D(64, (3,3), padding='same'))
model.add(Activation('relu'))
model.add(Conv2D(64, (3,3)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Dropout(0.25))
model.add(Flatten())
model.add(Dense(512))
model.add(Activation('relu'))
model.add(Dropout(0.5))
model.add(Dense(3))
model.add(Activation('softmax'))
opt = keras.optimizers.rmsprop(lr=0.0001, decay=1e-6)
model.compile(loss='categorical_crossentropy',
optimizer=opt, metrics=['accuracy'])
model.fit(X, y, batch_size=32, epochs=100)
# モデルの保存
model.save("./animal_cnn.h5")
return model
###model = Sequential()
モデルオブジェクトを作成する
###model.add(Conv2D(...))
層を追加する
###model.add(Activation('relu'))
活性化関数として「ReLU(Rectified Linear Unit)」を用いる層を追加する
###model.add(MaxPooling2D(pool_size=(2,2)))
マックスプーリング(インプットを所定の領域で区切って、各領域の最大値を出力する)する層を追加する
###model.add(Dropout(0.25))
25%(何の?)を捨ててデータの偏りを無くす
###opt = keras.optimizers.rmsprop(lr=0.0001, decay=1e-6)
最適化の宣言。optimizers.rmsprop
という手法で、ラーニングレートは0.0001、学習率を下げていくレートは1回あたり0.000001。
###model.compile()
モデルのコンパイル。
###model.fit(X, y, batch_size=32, epochs=100)
X
とy
でトレーニングを行う。
batch_size
は1回のトレーニングで用いるデータの数。
epochsは
トレーニングを何セットやるか。
##訓練結果の評価
evaluate
メソッドで作成したモデルの検証を行う。
def model_eval(model, X, y):
scores = model.evaluate(X, y, verbose=1)
print('test Loss: ', scores[0])
print('test Accuracy: ', scores[1])