学习目标
- 理解验证集的作用,使用训练集和验证集来完成训练。
- 了解调参流程
构造验证集
机器学习的本质是一个拟合的过程,深度学习中的参数量非常多,我们构建的模型是非常容易过拟合的。
过拟合和欠拟合
过拟合指的是训练的程度过深或者训练数据过少而导致的一种现象,过拟合使得本应该记住训练样本的共性的模型记住了训练样本的一些特性,导致的该模型泛化能力差,鲁棒性较弱。表现为在训练集上的效果很好,但是在验证集、测试集上的效果就很差。
拿分类模型举例,过拟合,我们可以通俗的理解为,模型将所有的图片都“背”下了,模型知道输入A图片就输出b类型,它学到的不是A图片所含有的特征,而仅仅是A图片对应b类型。如果是这样的话,遇到一个新的图片,模型是无法准确的判断它的类型的。
欠拟合的话,在训练集上的效果就很差。可能是训练的程度不够或者模型本身的框架有问题。表现为训练集的效果很差,在验证集的效果也很差。
过拟合和欠拟合是与迭代的次数和模型的复杂度有关的。
那么问题来了,我们每次都是训练完模型,再去测试的。我们是如何知道我们的模型是否过拟合了呢?——划分验证集
验证集
为了解决上述问题,我们构建一个与测试集尽可能分布一致的样本集(验证集),在每次迭代一轮之后,我们用该样本集对我们的模型的参数进行一次验证,在验证集中查看loss的值、准确率来判断模型是否过拟合。
注意:
- 验证集是不用于参数更新的。
- 验证集尽可能和测试集分布一致,在这种情况下我们才可以将验证集的精度当做准确的精度。
验证集的划分方法:
- 留出法
- 交叉验证法
- 自助采样法
pytorch中的模型保存与加载
模型的参数的保存:torch.save(model.state_dict(),'model.pt')
模型的加载:model.load_state_dict(torch.load('model.pt'))
模型的调参流程
深度学习实践性较强,有着较为众多的网络结构和超参数,是需要反复尝试的。
我们搭建一个神经网络的流程应该如下
- 搭建一个初步的模型,可以实现数据集的加载,模型的搭建,可以跑通训练,验证,测试的流程。这时候因为我们的模型很垃圾,所以会是欠拟合的效果,但是一定要建立起来一个输入到输出的模型。
- 尝试增加模型的复杂度,观察训练集精度,使模型逐渐达到过拟合的效果。(训练集效果好,验证集效果差)
- 模型过拟合了,开始使用正则化,增大数据量,数据增扩等方法来限制过拟合,最终达到完美拟合的效果。