在深度学习模型训练过程中,监控模型性能并保存最佳模型是至关重要的。本文将介绍如何在Keras中实现这一功能,并通过紧急与非紧急车辆分类的案例进行详细说明。假设读者已具备一定的Keras模型构建基础,因此本文将重点介绍模型检查点的设置和使用。
将按照以下步骤进行:
首先,需要加载所需的库和数据集。以下是加载数据集的代码示例:
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
%matplotlib inline
from keras.layers import Dense, InputLayer
from keras.models import Sequential
from keras.optimizers import Adam
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
from google.colab import drive
drive.mount('/content/drive')
!unzip /content/drive/My\ Drive/Dataset.zip
data = pd.read_csv('Dataset/emergency_classification.csv')
接下来,设置随机种子并查看数据集的前五行:
seed = 42
data.head()
然后,使用该文件加载图像,并将它们存储在名为“X”的变量中,同时将目标变量存储在名为“y”的变量中:
X = []
for img_name in data.image_names:
img = plt.imread('Dataset/images/' + img_name)
X.append(img)
X = np.array(X)
y = data.emergency_or_not.values
查看图像数组的形状:
X.shape
接下来,将三维图像矩阵转换为一维。将224 x 224 x 3的三个维度转换为一维,即224*224*3 = 150528:
X = X.reshape(X.shape[0], 224*224*3)
X.shape
检查图像的最小值和最大值:
X.min(), X.max()
将0到255的范围转换为0到1,并通过对每个像素值除以255来归一化:
X = X / X.max()
X.min(), X.max()
现在,将创建训练集和验证集:
X_train, X_valid, y_train, y_valid = train_test_split(X, y, test_size=0.3, random_state=seed)
(X_train.shape, y_train.shape), (X_valid.shape, y_valid.shape)
输入形状将是这些图像的每个特征的数量,即224*224*3。然后使用两个隐藏层,每个隐藏层有100个神经元和sigmoid激活函数。最后是输出层,它有一个神经元和sigmoid激活函数:
model = Sequential()
model.add(InputLayer(input_shape=(224*224*3,)))
model.add(Dense(100, activation='sigmoid'))
model.add(Dense(100, activation='sigmoid'))
model.add(Dense(units=1, activation='sigmoid'))
接下来,将编译模型,并定义损失函数和优化器:
adam = Adam(lr=1e-5)
model.compile(loss='binary_crossentropy', optimizer=adam, metrics=['accuracy'])
现在将训练模型,并在此过程中定义模型检查点。首先,从Keras的“callbacks”模块导入模型检查点函数:
from keras.callbacks import ModelCheckpoint
定义模型检查点,指定保存模型权重的路径:
filepath = "best_weights.hdf5"
checkpoint = ModelCheckpoint(filepath, monitor='val_accuracy', verbose=1, save_best_only=True, mode='max')
callbacks_list = [checkpoint]
调用模型检查点函数,并定义要保存模型的路径,即best_weights.hdf5。然后定义要监控的指标,即验证集准确率val_accuracy。设置verbose=1以在每个epoch后打印摘要,并将save_best_only设置为True,以便仅保存最佳模型。最后,定义mode='max',因为希望获得最大的验证集准确率。接下来,将模型训练50个epoch,设置批量大小为128,并提供训练集和验证集:
model_history = model.fit(X_train, y_train, epochs=50, batch_size=128, validation_data=(X_valid, y_valid), callbacks=callbacks_list)
模型训练完成后,将评估模型性能。首先检查验证集上的准确率:
print('Accuracy on validation set:', accuracy_score(y_valid, model.predict_classes(X_valid)[:, 0]), '%')
model.load_weights("best_weights.hdf5")
print('Accuracy on validation set:', accuracy_score(y_valid, model.predict_classes(X_valid)[:, 0]), '%')