宝可梦图像分类模型训练:使用迁移学习和卷积神经网络区分妙蛙种子、小火龙、杰尼龟、皮卡丘和超梦
首先,我们需要导入必要的库。
import tensorflow as tf
import numpy as np
import os
import random
import pathlib
from tensorflow.keras import layers
from keras_preprocessing.image import ImageDataGenerator
接下来,我们需要读取数据集,并将其打乱顺序。
data_dir = 'data' # 数据集所在的目录
# 读取所有图像路径
data_dir = pathlib.Path(data_dir)
image_paths = list(data_dir.glob('*/*'))
image_paths = [str(path) for path in image_paths]
# 将标签转换为数字编码
label_names = sorted(item.name for item in data_dir.glob('*/') if item.is_dir())
label_to_index = dict((name, index) for index,name in enumerate(label_names))
labels = [label_to_index[pathlib.Path(path).parent.name] for path in image_paths]
# 将图像路径和标签打乱
random.seed(0)
random.shuffle(image_paths)
random.shuffle(labels)
# 将数据集分为训练集、验证集和测试集
train_size = int(0.6 * len(image_paths))
val_size = int(0.2 * len(image_paths))
test_size = len(image_paths) - train_size - val_size
train_image_paths = image_paths[:train_size]
train_labels = labels[:train_size]
val_image_paths = image_paths[train_size:train_size+val_size]
val_labels = labels[train_size:train_size+val_size]
test_image_paths = image_paths[-test_size:]
test_labels = labels[-test_size:]
接下来,我们需要对图像进行预处理。
IMG_HEIGHT = 224 # 图像高度
IMG_WIDTH = 224 # 图像宽度
BATCH_SIZE = 32 # 批量大小
# 通过ImageDataGenerator进行数据增强和归一化
train_datagen = ImageDataGenerator(
rescale=1./255,
rotation_range=20,
width_shift_range=0.2,
height_shift_range=0.2,
shear_range=0.2,
zoom_range=0.2,
horizontal_flip=True,
fill_mode='nearest')
val_datagen = ImageDataGenerator(rescale=1./255)
test_datagen = ImageDataGenerator(rescale=1./255)
# 生成训练集、验证集和测试集
train_data = train_datagen.flow_from_directory(
'data',
target_size=(IMG_HEIGHT, IMG_WIDTH),
batch_size=BATCH_SIZE,
class_mode='categorical',
subset='training')
val_data = val_datagen.flow_from_directory(
'data',
target_size=(IMG_HEIGHT, IMG_WIDTH),
batch_size=BATCH_SIZE,
class_mode='categorical',
subset='validation')
test_data = test_datagen.flow_from_directory(
'data',
target_size=(IMG_HEIGHT, IMG_WIDTH),
batch_size=BATCH_SIZE,
class_mode='categorical')
接下来,我们可以构建一个卷积神经网络。
# 构建模型
model = tf.keras.models.Sequential([
# 卷积层1
tf.keras.layers.Conv2D(32, (3, 3), activation='relu', input_shape=(IMG_HEIGHT, IMG_WIDTH, 3)),
tf.keras.layers.MaxPooling2D((2, 2)),
# 卷积层2
tf.keras.layers.Conv2D(64, (3, 3), activation='relu'),
tf.keras.layers.MaxPooling2D((2, 2)),
# 卷积层3
tf.keras.layers.Conv2D(128, (3, 3), activation='relu'),
tf.keras.layers.MaxPooling2D((2, 2)),
# 卷积层4
tf.keras.layers.Conv2D(128, (3, 3), activation='relu'),
tf.keras.layers.MaxPooling2D((2, 2)),
# 扁平层
tf.keras.layers.Flatten(),
# 全连接层1
tf.keras.layers.Dense(512, activation='relu'),
# 全连接层2
tf.keras.layers.Dense(5, activation='softmax')
])
# 编译模型
model.compile(
optimizer=tf.keras.optimizers.Adam(lr=0.001),
loss='categorical_crossentropy',
metrics=['accuracy'])
# 打印模型结构
model.summary()
我们可以使用TensorBoard对准确率和损失进行可视化。
# 记录度量指标并在TensorBoard中查看结果
tensorboard_callback = tf.keras.callbacks.TensorBoard(log_dir='./logs')
# 训练模型
history = model.fit(
train_data,
epochs=100,
validation_data=val_data,
callbacks=[tensorboard_callback])
我们可以使用模型对测试集进行预测,并计算准确率。
test_loss, test_acc = model.evaluate(test_data)
print('Test accuracy:', test_acc)
最后,我们可以保存模型。
# 保存模型
model.save('pokemon_classifier.h5')
原文地址: https://www.cveoy.top/t/topic/nUaU 著作权归作者所有。请勿转载和采集!