Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
7
Help us understand the problem. What is going on with this article?
@yohiro

kerasで画像認識

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

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])
7
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
yohiro
広島在住の組込系ソフトウェアエンジニアです。 ずっとCの人間でしたが、最近はPythonなど流行りモノに興味有り。

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
7
Help us understand the problem. What is going on with this article?