「学習済みモデル」って書くと、一流大学を出たファッションモデルの様な気もするけど、そうではないですね。大量のデータを読ませて、形作られた脳的なものをファイルにしたものです。ファイルの拡張子は「.h5」とか「.keras」とか、他にもあるようでしたが、ここでは「.keras」を作ります。
手順1 学習済みモデルの作成
先に作った「dataset01」を使って、以下のスクリプトで学習させます。
python
###############################################################
# 学習済みモデルの作成 Flatten
###############################################################
import os
import numpy as np
import matplotlib.pyplot as plt
from tensorflow.keras.preprocessing.image import ImageDataGenerator
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Conv2D, MaxPooling2D, Flatten, Dense, Dropout
from tensorflow.keras.optimizers import Adam
# --- 入力画像サイズ(400×200、グレースケール) ---
img_width = 400
img_height = 200
input_shape = (img_height, img_width, 1) # (高さ, 幅, チャンネル数)
# --- クラス数(5分類:toyA, toyB, toyC, toyD, toyE) ---
num_classes = 5
# --- データ拡張(回転や左右反転は使わない) ---
train_datagen = ImageDataGenerator(
rescale=1.0 / 255,
validation_split=0.2 # 20%を検証用に分割
)
# --- 訓練データジェネレータ ---
train_generator = train_datagen.flow_from_directory(
'dataset01',
target_size=(img_height, img_width),
color_mode='grayscale',
class_mode='categorical',
batch_size=16,
subset='training',
shuffle=True
)
# --- 検証データジェネレータ ---
val_generator = train_datagen.flow_from_directory(
'dataset01',
target_size=(img_height, img_width),
color_mode='grayscale',
class_mode='categorical',
batch_size=16,
subset='validation',
shuffle=False
)
# --- モデル構築(Flatten構造CNN)---
model = Sequential()
# 畳み込み層+プーリング層(1)
model.add(Conv2D(32, (3, 3), activation='relu', input_shape=input_shape))
model.add(MaxPooling2D(pool_size=(2, 2)))
# 畳み込み層+プーリング層(2)
model.add(Conv2D(64, (3, 3), activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
# 畳み込み層+プーリング層(3)
model.add(Conv2D(128, (3, 3), activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
# Flattenでベクトル化
model.add(Flatten())
model.add(Dropout(0.5)) # 過学習防止
model.add(Dense(128, activation='relu'))
# 出力層(5クラス:softmax)
model.add(Dense(num_classes, activation='softmax'))
# --- モデルのコンパイル ---
model.compile(
optimizer=Adam(learning_rate=0.0005),
loss='categorical_crossentropy',
metrics=['accuracy']
)
# --- モデル構造の表示 ---
model.summary()
# --- 学習開始 ---
history = model.fit(
train_generator,
epochs=20,
validation_data=val_generator
)
# --- 学習結果をグラフ表示 ---
plt.plot(history.history['accuracy'], label='train acc')
plt.plot(history.history['val_accuracy'], label='val acc')
plt.plot(history.history['loss'], label='train loss')
plt.plot(history.history['val_loss'], label='val loss')
plt.title('Flatten CNN Learning Curve')
plt.xlabel('Epoch')
plt.ylabel('Accuracy / Loss')
plt.grid(True)
plt.legend()
plt.show()
# --- モデル保存(.keras形式) ---
model.save("toyX_model_flatten.keras")
print(" モデル完成:toyX_model_flatten.keras")
手順2 学習済みモデルの調整
数分後・・・学習済みモデル「keras」のファイルが同フォルダにできあがり!
学習のさせ方を指定することで、目的にあったモデルを作成。結果が芳しくない場合は、上記スクリプトの「データ拡張」のところで、パラメータを変えたり追加したり、過学習っぽければ、plotグラフを見て EarlyStopping項目を追加したりするといいかもしれない・・・でも、まあ最初は何かしら動けばOK。