2
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

kerasで画像認識

Posted at

前回作成した訓練用データを使ってサル・イノシシ・カラスを見分ける画像認識プログラムを作成する

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

メイン関数

おおまかな流れは以下の通り:
1. 前回保存したanimal.npyを読み込む
2. 訓練用データを訓練関数に渡してモデルを作成
3. 作成したモデルを評価関数に渡して分類精度を検証

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)

Xyでトレーニングを行う。
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])
2
8
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
2
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?