模型训练与验证
网络模型构建好后,需要利用训练数据不断进行学习训练来降低loss 提高模型性能 使得最后得到的结果误差尽可能小,尽可能满足需要
一个成熟合格的深度学习训练流程应该具备:
·1、在训练集上进行训练并在验证集上进行验证
2、模型可以保留最优权重,并读取权重
3、记录下训练集和验证集的精度,便于调参
构建验证集
训练过程是容易出现过拟合的,也就是模型过多的学习了数据比较细枝末节的特征,而不是该类的特征,即不具备普遍性的特征,此时模型就会出现过拟合现象
而在训练过程中要保证模型的改变不接触测试集数据,来防止对测试集数据出现过拟合现象。这时候就需要验证集来验证模型的精度
过拟合和欠拟合的示意图如下图所示:
为了过拟合问题,可以通过构建验证集的方法来减少过拟合现象
使用训练集对模型进行训练及调参,使用验证集用来模型精度及调整模型超参数,使用测试集用来验证模型的泛化能力
验证集的划分方法:
1、留出法 直接将训练集划分成两部分 缺点:仅有一份验证集,会可能出现验证集过拟合
2、交叉验证法 分成k份 k-1份作为训练集,1份作为验证集,模型验证精度是k份平均,优点是验证集精度可靠,缺点是训练k次
3、自助采样
通过有放回的采样方式得到新的训练集和验证集
验证和训练
迭代进行 采用上章写好的代码(修改一下改成使用gpu 只用cpu的话训练速度太慢了)
数据读取代码:
train_loader = torch.utils.data.DataLoader(
train_dataset,
batch_size=10,
shuffle=True,
num_workers=10,
)
val_loader = torch.utils.data.DataLoader(
val_dataset,
batch_size=10,
shuffle=False,
num_workers=10,
)
model = SVHN_Model1()
criterion = nn.CrossEntropyLoss (size_average=False)
optimizer = torch.optim.Adam(model.parameters(), 0.001)
best_loss = 1000.0
for epoch in range(20):
print('Epoch: ', epoch)
train(train_loader, model, criterion, optimizer, epoch)
val_loss = validate(val_loader, model, criterion)
# 记录下验证集精度
if val_loss < best_loss:
best_loss = val_loss
torch.save(model.state_dict(), './model.pt')