【精度监测|模型保存】深度学习卷积神经网络的训练过程中如何监测训练集和验证集的精度并保存最优模型呢??
【精度监测|模型保存】深度学习卷积神经网络的训练过程中如何监测训练集和验证集的精度并保存最优模型呢??
文章目录
在深度学习模型的训练过程中,监测训练集和验证集的精度和损失,以及保存最优模型参数,是确保模型效果和防止过拟合的重要步骤。
1.监测训练和验证集的精度与损失
在深度学习训练中,通常会通过计算每个 epoch(或每个 batch)的损失函数值和精度来评估模型的训练情况。PyTorch 和 TensorFlow 等主流深度学习框架都支持这种监测方式。
PyTorch 代码示例:监测训练集和验证集的精度与损失
import torch
import torch.nn as nn
import torch.optim as optim
from torch.utils.data import DataLoader
from torchvision import datasets, transforms
# 假设有一个简单的神经网络模型
class SimpleModel(nn.Module):
def __init__(self):
super(SimpleModel, self).__init__()
self.fc = nn.Linear(28 * 28, 10)
def forward(self, x):
x = x.view(-1, 28 * 28) # 将输入的图像展平为一维向量
return self.fc(x)
# 初始化模型、损失函数和优化器
model = SimpleModel()
criterion = nn.CrossEntropyLoss()
optimizer = optim.SGD(model.parameters(), lr=0.01)
# 定义数据增强和加载器
transform = transforms.Compose([transforms.ToTensor(), transforms.Normalize((0.5,), (0.5,))])
train_dataset = datasets.MNIST(root='./data', train=True, download=True, transform=transform)
val_dataset = datasets.MNIST(root='./data', train=False, download=True, transform=transform)
train_loader = DataLoader(dataset=train_dataset, batch_size=64, shuffle=True)
val_loader = DataLoader(dataset=val_dataset, batch_size=64, shuffle=False)
# 用于保存每个 epoch 的损失和精度
train_losses = []
val_losses = []
train_accuracies = []
val_accuracies = []
# 训练和验证函数
def train_epoch(model, loader, criterion, optimizer):
model.train()
running_loss = 0.0
correct = 0
total = 0
for inputs, labels in loader:
# 前向传播
outputs = model(inputs)
loss = criterion(outputs, labels)
# 反向传播与优化
optimizer.zero_grad()
loss.backward()
optimizer.step()
# 计算损失
running_loss += loss.item() * inputs.size(0)
_, predicted = torch.max(outputs, 1)
correct += (predicted == labels).sum().item()
total += labels.size(0)
return running_loss / total, correct / total
def validate_epoch(model, loader, criterion):
model.eval()
running_loss = 0.0
correct = 0
total = 0
with torch.no_grad():
for inputs, labels in loader:
outputs = model(inputs)
loss = criterion(outputs, labels)
running_loss += loss.item() * inputs.size(0)
_, predicted = torch.max(outputs, 1)
correct += (predicted == labels).sum().item()
total += labels.size(0)
return running_loss / total, correct / total
# 训练主循环
num_epochs = 10
best_val_loss = float('inf')
for epoch in range(num_epochs):
train_loss, train_acc = train_epoch(model, train_loader, criterion, optimizer)
val_loss, val_acc = validate_epoch(model, val_loader, criterion)
train_losses.append(train_loss)
val_losses.append(val_loss)
train_accuracies.append(train_acc)
val_accuracies.append(val_acc)
print(f"Epoch {epoch+1}/{num_epochs}: "
f"Train Loss: {train_loss:.4f}, Train Acc: {train_acc:.4f}, "
f"Val Loss: {val_loss:.4f}, Val Acc: {val_acc:.4f}")
# 保存最优模型
if val_loss < best_val_loss:
best_val_loss = val_loss
torch.save(model.state_dict(), 'best_model.pth') # 保存最优模型的参数
代码解释:
(1)train_epoch 和 $validate_epoch:
- 这两个函数分别用于在训练集和验证集上计算损失和精度。
- 每个 epoch 结束后,函数返回当前 epoch 的平均损失和精度。
(2)train_losses 和 val_losses:
- 列表用于记录每个 epoch 的训练集和验证集的损失值。
(3)保存最优模型:
- 通过比较验证集上的损失值,将当前 epoch 的验证损失与当前保存的最小验证损失进行比较。
- 如果当前损失更小,则保存当前模型的参数到 best_model.pth 文件中。
2.保存最优模型参数的策略
PyTorch保存与加载模型参数
- 在 PyTorch 中,使用
torch.save()
函数可以保存模型的状态字典(包含参数)。 - 使用
torch.load()
加载模型并恢复参数。
# 保存模型的参数
torch.save(model.state_dict(), 'model.pth')
# 加载模型的参数
model.load_state_dict(torch.load('model.pth'))
TensorFlow中的模型保存与监测
在 TensorFlow/Keras 中,模型监测和保存通常通过 ModelCheckpoint
回调实现。ModelCheckpoint
提供了自动保存模型的功能,可以根据损失值或其他指标自动保存最优模型。
TensorFlow 示例:
import tensorflow as tf
from tensorflow.keras.callbacks import ModelCheckpoint
# 定义简单的模型
model = tf.keras.models.Sequential([
tf.keras.layers.Flatten(input_shape=(28, 28)),
tf.keras.layers.Dense(128, activation='relu'),
tf.keras.layers.Dense(10, activation='softmax')
])
# 编译模型
model.compile(optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
# 定义模型检查点回调
checkpoint_callback = ModelCheckpoint(
filepath='best_model.h5', # 保存模型的文件路径
monitor='val_loss', # 监测验证集的损失
save_best_only=True, # 仅保存验证集损失最小的模型
save_weights_only=False, # 保存完整的模型,包括权重和结构
mode='min', # 当损失变小的时候保存模型
verbose=1 # 打印保存信息
)
# 准备训练数据和验证数据
(x_train, y_train), (x_val, y_val) = tf.keras.datasets.mnist.load_data()
x_train, x_val = x_train / 255.0, x_val / 255.0
# 训练模型并使用 ModelCheckpoint 保存最优模型
history = model.fit(
x_train, y_train,
epochs=10,
validation_data=(x_val, y_val),
callbacks=[checkpoint_callback] # 回调保存最优模型
)
代码解释:
1.ModelCheckpoint
参数详解:
filepath
: 保存模型的路径,可以是文件路径或者带有占位符的字符串(如model_{epoch:02d}.h5
)。monitor
: 要监测的指标,如val_loss
(验证集损失)或val_accuracy
(验证集精度)。save_best_only
: 如果设置为True
,则仅保存验证集上的最优模型。save_weights_only
: 设置为False
时保存整个模型,包括权重和模型架构;设置为True
时仅保存模型权重。mode
: 监测指标的方向,'min'
表示监测最小值(如损失),'max'
表示监测最大值(如精度)。verbose
: 设置为 1 时会在每次保存模型时打印信息。
2.训练和验证数据的处理:
- MNIST 数据集被加载并归一化,然后被输入到模型中进行训练。
3.模型的保存:
ModelCheckpoint
在每个epoch
后自动检查验证集的损失值,并根据监测结果保存最优模型。
总结
- 监测训练过程:通过记录训练集和验证集的损失与精度,可以实时监控模型的训练效果,并且防止模型过拟合。
- 保存最优模型:通过比较验证集的性能,保存训练过程中的最优模型参数或整个模型。
- PyTorch 的模型保存与加载:通过
torch.save()
和torch.load()
可以保存和加载模型的状态字典。 - Keras 的 ModelCheckpoint:可以自动保存最优模型,参数如
monitor
和save_best_only
控制保存策略。