首先,我们需要导入必要的库。

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 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录