服装图像分类模型训练 - 使用 TensorFlow 和 Keras
import os
import numpy as np
import matplotlib.pyplot as plt
import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import layers
from keras.layers.core import Dropout
# 定义训练集和测试集路径
train_dir = 'C:/Users/28938/Desktop/shengdu/Data/train'
test_dir = 'C:/Users/28938/Desktop/shengdu/Data/test'
# 定义类别标签
class_names = ['MEN_Coats', 'MEN_Hood', 'MEN_Suits', 'WOMEN_Dress', 'WOMEN_Hood']
# 定义图像尺寸和批次大小
img_height = 224
img_width = 224
batch_size = 32
# 从目录中读取训练集和测试集
train_ds = keras.preprocessing.image_dataset_from_directory(
train_dir,
validation_split=0.2,
subset='training',
seed=42,
image_size=(img_height, img_width),
batch_size=batch_size
)
val_ds = keras.preprocessing.image_dataset_from_directory(
train_dir,
validation_split=0.2,
subset='validation',
seed=42,
image_size=(img_height, img_width),
batch_size=batch_size
)
test_ds = keras.preprocessing.image_dataset_from_directory(
test_dir,
seed=42,
image_size=(img_height, img_width),
batch_size=batch_size
)
# 定义函数以展示图像
def plotImages(img_arr):
fig, axes = plt.subplots(1, 5, figsize=(20,20))
axes = axes.flatten()
for img, ax in zip( img_arr, axes):
ax.imshow(img)
ax.axis('off')
plt.tight_layout()
plt.show()
# 定义数据增强器
data_augmentation = keras.Sequential(
[
layers.experimental.preprocessing.RandomFlip('horizontal', input_shape=(img_height, img_width, 3)),
layers.experimental.preprocessing.RandomRotation(0.1),
layers.experimental.preprocessing.RandomZoom(0.1),
]
)
# 定义模型输入
input_shape = (img_height, img_width, 3)
# 建立模型
model = keras.Sequential([
data_augmentation,
layers.experimental.preprocessing.Rescaling(1./255),
layers.Conv2D(32, 3, padding='same', activation='relu', input_shape=input_shape),
layers.MaxPooling2D(),
layers.Dropout(0.2),
layers.Conv2D(64, 3, padding='same', activation='relu'),
layers.MaxPooling2D(),
layers.Dropout(0.2),
layers.Conv2D(128, 3, padding='same', activation='relu'),
layers.MaxPooling2D(),
layers.Dropout(0.2),
layers.Flatten(),
layers.Dense(256, activation='relu'),
layers.Dense(len(class_names))
])
# 编译模型
model.compile(optimizer='adam',
loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),
metrics=['accuracy'])
# 打印模型结构
model.summary()
# 显示前5张图像
plt.figure(figsize=(10, 10))
for images, labels in train_ds.take(1):
for i in range(5):
ax = plt.subplot(5, 5, i + 1)
plt.imshow(images[i].numpy().astype('uint8'))
plt.title(class_names[labels[i]])
plt.axis('off')
# 设定训练参数
epochs = 15
# 开始训练模型
#history = model.fit(train_ds, validation_data=val_ds, epochs=epochs)
batch_size = 16
history = model.fit(train_ds, validation_data=val_ds, epochs=epochs, batch_size=batch_size)
# 对模型进行评估
test_loss, test_acc = model.evaluate(test_ds)
print('Test accuracy:', test_acc)
# 对模型进行预测
predictions = model.predict(test_ds)
# 绘制模型准确度和损失随时间变化的曲线
acc = history.history['accuracy']
val_acc = history.history['val_accuracy']
loss = history.history['loss']
val_loss = history.history['val_loss']
epochs_range = range(epochs)
plt.figure(figsize=(8, 8))
plt.subplot(2, 1, 1)
plt.plot(epochs_range, acc, label='Training Accuracy')
plt.plot(epochs_range, val_acc, label='Validation Accuracy')
plt.legend(loc='lower right')
plt.title('Training and Validation Accuracy')
plt.subplot(2, 1, 2)
plt.plot(epochs_range, loss, label='Training Loss')
plt.plot(epochs_range, val_loss, label='Validation Loss')
plt.legend(loc='upper right')
plt.title('Training and Validation Loss')
plt.show()
详细分析每句代码内容:
- 导入必要的库
import os
import numpy as np
import matplotlib.pyplot as plt
import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import layers
from keras.layers.core import Dropout
- 定义训练集和测试集路径,以及类别标签
train_dir = 'C:/Users/28938/Desktop/shengdu/Data/train'
test_dir = 'C:/Users/28938/Desktop/shengdu/Data/test'
class_names = ['MEN_Coats', 'MEN_Hood', 'MEN_Suits', 'WOMEN_Dress', 'WOMEN_Hood']
- 定义图像尺寸和批次大小,从目录中读取训练集和测试集
img_height = 224
img_width = 224
batch_size = 32
train_ds = keras.preprocessing.image_dataset_from_directory(
train_dir,
validation_split=0.2,
subset='training',
seed=42,
image_size=(img_height, img_width),
batch_size=batch_size
)
val_ds = keras.preprocessing.image_dataset_from_directory(
train_dir,
validation_split=0.2,
subset='validation',
seed=42,
image_size=(img_height, img_width),
batch_size=batch_size
)
test_ds = keras.preprocessing.image_dataset_from_directory(
test_dir,
seed=42,
image_size=(img_height, img_width),
batch_size=batch_size
)
- 定义函数以展示图像
def plotImages(img_arr):
fig, axes = plt.subplots(1, 5, figsize=(20,20))
axes = axes.flatten()
for img, ax in zip( img_arr, axes):
ax.imshow(img)
ax.axis('off')
plt.tight_layout()
plt.show()
- 定义数据增强器
data_augmentation = keras.Sequential(
[
layers.experimental.preprocessing.RandomFlip('horizontal', input_shape=(img_height, img_width, 3)),
layers.experimental.preprocessing.RandomRotation(0.1),
layers.experimental.preprocessing.RandomZoom(0.1),
]
)
- 定义模型输入,建立模型
input_shape = (img_height, img_width, 3)
model = keras.Sequential([
data_augmentation,
layers.experimental.preprocessing.Rescaling(1./255),
layers.Conv2D(32, 3, padding='same', activation='relu', input_shape=input_shape),
layers.MaxPooling2D(),
layers.Dropout(0.2),
layers.Conv2D(64, 3, padding='same', activation='relu'),
layers.MaxPooling2D(),
layers.Dropout(0.2),
layers.Conv2D(128, 3, padding='same', activation='relu'),
layers.MaxPooling2D(),
layers.Dropout(0.2),
layers.Flatten(),
layers.Dense(256, activation='relu'),
layers.Dense(len(class_names))
])
- 编译模型
model.compile(optimizer='adam',
loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),
metrics=['accuracy'])
- 打印模型结构,显示前5张图像
model.summary()
plt.figure(figsize=(10, 10))
for images, labels in train_ds.take(1):
for i in range(5):
ax = plt.subplot(5, 5, i + 1)
plt.imshow(images[i].numpy().astype('uint8'))
plt.title(class_names[labels[i]])
plt.axis('off')
- 设定训练参数,开始训练模型
epochs = 15
batch_size = 16
history = model.fit(train_ds, validation_data=val_ds, epochs=epochs, batch_size=batch_size)
- 对模型进行评估,输出测试集准确度
test_loss, test_acc = model.evaluate(test_ds)
print('Test accuracy:', test_acc)
- 对模型进行预测,绘制模型准确度和损失随时间变化的曲线
predictions = model.predict(test_ds)
acc = history.history['accuracy']
val_acc = history.history['val_accuracy']
loss = history.history['loss']
val_loss = history.history['val_loss']
epochs_range = range(epochs)
plt.figure(figsize=(8, 8))
plt.subplot(2, 1, 1)
plt.plot(epochs_range, acc, label='Training Accuracy')
plt.plot(epochs_range, val_acc, label='Validation Accuracy')
plt.legend(loc='lower right')
plt.title('Training and Validation Accuracy')
plt.subplot(2, 1, 2)
plt.plot(epochs_range, loss, label='Training Loss')
plt.plot(epochs_range, val_loss, label='Validation Loss')
plt.legend(loc='upper right')
plt.title('Training and Validation Loss')
plt.show()
原文地址: https://www.cveoy.top/t/topic/oy8z 著作权归作者所有。请勿转载和采集!