概要
画像処理をする AI を作ってみたかったので、とりあえず動物の種類を見分けるためのニューラルネットワークを作った。
開発環境
-
python 3.5
-
keras 2.2.2
使用したライブラリ
# ニューラルネットワークの定義用のモジュール
from keras.models import Sequential
# 畳み込みやプーリングの処理用モジュール
from keras.layers import Conv2D, MaxPooling2D
# 活性化関数、ドロップアウト処理、データを一次元に返還する、全結合層のていぎ
from keras.layers import Activation, Dropout, Flatten, Dense
# numpyデータを扱うモジュール
from keras.utils import np_utils
import keras
import numpy as np
## 識別する画像のラベル
# ラベルの設定
classes = ["monkey", "boar", "crow"]
# 0をmonkey,1をboar,2をcrowとする
NumClasses = len(classes)
# 画像の大きさを50ピクセルとする
ImageSize = 50
学習モデル
基本的に活性化関数にはrelu
,
def model_train(X, y):
# モデルの作成
model = Sequential()
# 第一層の定義
# 32個の3*3のフィルター
# 畳み込み結果が同じサイズになるように畳み込む
# 入力の形を50*50*3(0番目は枚数なので不要)
model.add(Conv2D(32, (3, 3), padding='same', input_shape=X.shape[1:]))
model.add(Activation('relu'))
# 2層目
model.add(Conv2D(32, (3, 3)))
model.add(Activation('relu'))
# プーリングの大きさを2*2(最大値を取り出す)
model.add(MaxPooling2D(pool_size=(2, 2)))
# 25%のデータを捨ててデータの偏りをなくす
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))
# 出力は3つ(画像が3パターンなので)
model.add(Dense(3))
# softmaxを使って確率を計算する
model.add(Activation('softmax'))
# 最適化の手法の定義
opt = keras.optimizers.RMSprop(lr=0.0001, decay=1e-6)
# モデルの最適化の宣言
# 損失関数を正解と推定値との誤差を指標にする
model.compile(loss='categorical_crossentropy',
optimizer=opt,
metrics=['accuracy'])
# 一回の学習で32枚、100回学習を行う
model.fit(X, y, batch_size=32, epochs=100)
# 結果の保存
model.save('./animalCNN.h5')
return model
評価関数
def model_eval(model, X, y):
# 学習したモデルを評価する
scores = model.evaluate(X, y, verbose=1)
# 結果の表示
print('Test Loss', scores[0])
print('test Accuracy', scores[1])
main 関数
学習データは事前にanimal.npy
という形で事前に作っておいた numpy 配列を使っています。
def main():
# 生成したnumpy配列を読み込む
X_train, X_test, Y_train, Y_test = np.load("./animal.npy")
# データの正規化(0~1に収める)
# 整数を浮動小数点に変換して255で割る
X_train = X_train.astype("float")/256
X_test = X_test.astype("float")/256
# one-hot-vectorに変換する
# 正解は1,それ以外は0にする
# [0,1,2]を[1.0.0][0.1.0][0.0.1]に変換する
Y_train = np_utils.to_categorical(Y_train, NumClasses)
Y_test = np_utils.to_categorical(Y_test, NumClasses)
# モデルの学習
# 学習データとラベルを引数として渡す
model = model_train(X_train, Y_train)
# モデルのトレーニング
# テストデータと学習データを渡す
model_eval(model, X_test, Y_test)
plot_model(model, to_file="model.png")
実行結果
Test Loss 0.9219977560344043
test Accuracy 0.7207207207207207
できた!!!