Task04:模型训练与验证
搭建好CNN网络之后,为了完成深度学习的基本训练流程,应该设置训练集和验证集,并最终在测试机上测试模型的表现。三个数据集的作用如下:
训练集(Train Set):模型用于训练和调整模型参数;
验证集(Validation Set):用来验证模型精度和调整模型超参数;
测试集(Test Set):验证模型的泛化能力。
在训练集上进行计算,不断更新神经网络参数;在验证集上验证,用于调整模型的复杂度,避免过拟合的现象。在训练的过程中应该不断记录训练误差以及在验证集上的验证误差。随着训练过程的进行,模型的复杂度上升,训练误差会越来越小,但是在验证集上,验证误差开始阶段会逐步降低,但是当模型过于复杂的时候,验证误差开始增大,模型的泛化能力减弱。这种现象可以通过下图说明:
所以应该根据记录的模型误差用于调整参数,并在训练结束之后保存最优的权重,以便于下次模型调用的时候使用。
一般来说,训练集和验证集的数据遵循独立同分布的原则。为了保证这一点,通常将提供的数据按照一定的比例随机划分成训练集和验证集两份。常用的划分方式有如下三种:
- 留出法(Hold-out)
直接将训练集划分成两部分,新的训练集和验证集。这种划分方式的优点是最为直接简单;缺点是只得到了一份验证集,有可能导致模型在验证集上过拟合。留出法应用场景是数据量比较大的情况。
- 交叉验证法(CrossValidation,CV)
将训练集划分成K份,将其中的K-1份作为训练集,剩余的1份作为验证集,循环K训练。这种划分方式是所有的训练集都是验证集,最终模型验证精度是K份平均得到。这种方式的优点是验证集精度比较可靠,训练K次可以得到K个有多样性差异的模型;CV验证的缺点是需要训练K次,不适合数据量很大的情况。
- 自助采样法(BootStrap)
通过有放回的采样方式得到新的训练集和验证集,每次的训练集和验证集都是有区别的。这种划分方式一般适用于数据量较小的情况。
为了在Pytorch中实现训练和验证过程,首先依然是需要封装训练集和验证集的数据容器
train_loader = torch.utils.data.DataLoader(
train_dataset,
batch_size=10,
shuffle=True,
num_workers=0,
)
val_loader = torch.utils.data.DataLoader(
val_dataset,
batch_size=10,
shuffle=False,
num_workers=0,
)
每训练完一个epoch,记录验证集精度。
model = SVHN_Model1(