训练模型
1.导入必要的库
pandas as pd
: Pandas是一个强大的数据分析和处理库,它提供了数据结构(如DataFrame)和工具,用于数据操作和分析。
tensorflow.keras.preprocessing.image import ImageDataGenerator
: ImageDataGenerator是Keras的一部分,它用于图像数据的预处理和增强,例如,随机裁剪、旋转、缩放等。
tensorflow.keras.models import Sequential
: Sequential模型是Keras中的一种模型,它允许您顺序地堆叠层。
tensorflow.keras.layers
: 包含了Keras中所有的层类型,如Conv2D、MaxPooling2D、Flatten、Dense等。
tensorflow.keras.optimizers
: 包含了Keras中所有的优化器类型,如Adam、SGD等。
sklearn.model_selection import train_test_split
: train_test_split是Scikit-Learn的一部分,它用于将数据集分割为训练集和测试集。
numpy as np
: NumPy是一个用于科学计算的库,它提供了高效的数组处理能力,对于图像处理等任务非常有用。
sklearn.preprocessing import LabelBinarizer
: LabelBinarizer是Scikit-Learn的一部分,它用于将类别标签转换为二进制数组。
matplotlib.pyplot as plt
: Matplotlib是一个绘图库,pyplot是其中的一个模块,它提供了一个类似于MATLAB的绘图框架。
import pickle
: pickle是Python的标准库,它用于序列化Python对象,以便将它们保存到文件或从文件中加载。
python
import pandas as pd
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
from sklearn.model_selection import train_test_split
import numpy as np
from sklearn.preprocessing import LabelBinarizer
import matplotlib.pyplot as plt
import pickle
2.定义超参数
python
INIT_LR = 0.01
EPOCHS = 30
BS = 32
3.读取训练和测试标签CSV文件
train_labels.csv和test_labels.csv在资源中。
python
# 读取训练标签CSV文件
train_labels_filename = 'train_labels.csv'
train_labels_df = pd.read_csv(train_labels_filename)
# 读取测试标签CSV文件
test_labels_filename = 'test_labels.csv'
test_labels_df = pd.read_csv(test_labels_filename)
4.确保标签是字符串类型
train_labels_df['label'] = train_labels_df['label'].astype(str):
train_labels_df['label']
:这是train_labels_df DataFrame中名为label的列。
.astype(str)
:这是Pandas中的一个方法,用于将列的数据类型转换为字符串类型。
test_labels_df['label'] = test_labels_df['label'].astype(str):
test_labels_df['label']
:这是test_labels_df DataFrame中名为label的列。
.astype(str)
:这是Pandas中的一个方法,用于将列的数据类型转换为字符串类型。
python
train_labels_df['label'] = train_labels_df['label'].astype(str)
test_labels_df['label'] = test_labels_df['label'].astype(str)
5.显示两个数据框的前几行以了解它们的结构
python
print(train_labels_df.head())
print(test_labels_df.head())
6.定义图像处理参数
img_width
:这是一个变量,用于存储图像的宽度。
img_height
:这是一个变量,用于存储图像的高度。
= 150, 150
:这行代码将img_width和img_height变量分别设置为150。
python
img_width, img_height = 150, 150
7.创建图像数据生成器
ImageDataGenerator
:这是Keras中的一个类,用于创建一个数据生成器,用于图像数据的增强和预处理。
rescale=1./255
:这是一个参数,用于将图像的像素值从0到255的范围转换为0到1的范围,这是常见的图像预处理步骤。
validation_split=0.2
:这是一个参数,用于指定训练数据中用于验证的比例。在这里,20%的数据将用于验证,80%的数据将用于训练。
data_gen
:这是生成的ImageDataGenerator对象,它将在后续的训练过程中用于生成增强的图像数据。
python
data_gen = ImageDataGenerator(rescale=1./255, validation_split=0.2)
8.设置目录路径
train和test压缩文件在资源中
python
# 并且数据集应该存储在环境可访问的路径中
train_dir = 'D:/rgzn/face/DATASET/train' # 包含子文件夹的父目录
test_dir = 'D:/rgzn/face/DATASET/test' # 包含子文件夹的父目录
9.创建训练和验证数据生成器
python
#flow_from_dataframe:这是Keras中的一个方法,用于创建一个数据生成器,它可以从DataFrame中加载图像和标签。
train_data_gen = data_gen.flow_from_dataframe(
#要加载的数据源
dataframe=train_labels_df,
#包含图像文件的目录
directory=train_dir,
#DataFrame中包含图像路径的列名。
x_col='image',
#DataFrame中包含标签的列名。
y_col='label',
#目标图像的大小
target_size=(img_width, img_height),
#每次迭代中从数据生成器中获取的样本数量。
batch_size=32,
#随机种子,用于确保每次运行时生成相同的数据增强
seed=42,
#数据集的子集,用于训练。
subset='training',
)
validation_data_gen = data_gen.flow_from_dataframe(
dataframe=test_labels_df,
directory=test_dir, # 包含子文件夹的父目录
x_col='image',
y_col='label',
target_size=(img_width, img_height),
batch_size=32,
seed=42,
#数据集的子集,用于验证。
subset='validation',
)
10.构建模型
python
# 构建模型
model = Sequential()
model.add(Conv2D(32, (3, 3), activation='relu', input_shape=(150, 150, 3)))
model.add(MaxPooling2D(pool_size=(2, 2)))
# 新增的卷积层
model.add(Conv2D(64, (3, 3), activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Conv2D(128, (3, 3), activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
# 展平层
model.add(Flatten())
# 全连接层
model.add(Dense(128, activation='relu'))
model.add(Dropout(0.5))
# 输出层
model.add(Dense(7, activation='softmax'))
11.编译模型
python
model.compile(loss='categorical_crossentropy',
optimizer='adam',
metrics=['accuracy'])
model
:这是之前创建和配置的Keras模型。
compile
:这是Keras中的一个方法,用于编译模型,指定训练过程中使用的损失函数、优化器和评估指标。
loss='categorical_crossentropy'
:这是模型使用的损失函数,适用于多类分类问题。
optimizer='adam'
:这是模型使用的优化器,用于调整模型的权重以最小化损失函数。
metrics=['accuracy']
:这是模型使用的评估指标,用于评估模型在训练数据上的性能。
12.训练模型并收集历史
python
history = model.fit(train_data_gen, epochs=EPOCHS, validation_data=validation_data_gen, batch_size=BS)
fit
:这是Keras中的一个方法,用于训练模型。
train_data_gen
:这是之前创建的训练数据生成器。
epochs=EPOCHS
:这是训练过程中重复训练数据的次数。
validation_data=validation_data_gen
:这是用于验证模型的数据。
batch_size=BS
:这是每次迭代中从数据生成器中获取的样本数量。
history
:这是训练过程中记录的性能指标,如损失和准确率。
13.绘制损失和准确率曲线
python
N = np.arange(0, EPOCHS)
#设置图表的样式
plt.style.use('ggplot')
plt.figure()
plt.plot(N, history.history['loss'], label='train_loss')
plt.plot(N, history.history['val_loss'], label='val_loss')
plt.plot(N, history.history['accuracy'], label='train_acc')
plt.plot(N, history.history['val_accuracy'], label='val_acc')
plt.title("Training Loss And Accuracy (CNN)")
plt.xlabel('Epoch #')
plt.ylabel('Loss/Accuracy')
plt.legend()
plt.axis([0, EPOCHS, 0, 2])
14.保存图表
python
plt.savefig('plot.png')
15.保存模型到本地
python
print('[INFO] 正在保存模型')
model.save('model.h5')