一、训练集,验证集,测试集的作用
- 训练集(Train Set):模型用于训练和调整模型参数;
- 验证集(Validation Set):用来验证模型精度和调整模型超参数;
- 测试集(Test Set):验证模型的泛化能力。
通俗来讲:训练集用于训练给定的模型。
验证集用于在模型之间进行选择(例如,随机森林还是神经网络更适合你的问题?)你想要一个有40棵树的随机森林还是50棵树的随机森林?)
测试集告诉你,你做的怎么样。
二、训练集,验证集的构造
在对于训练好的模型,也许会出现,欠拟合,过拟合,以及完美拟合三种情况,所以对于模型的选择至关重要,因此构造一个好的验证集也成为训练出合格模型的至关重要的一步。
解决上述问题最好的解决方法:构建一个与测试集尽可能分布一致的样本集(可称为验证集),在训练过程中不断验证模型在验证集上的精度,并以此控制模型的训练。
- 留出法(Hold-Out)
直接将训练集划分成两部分,新的训练集和验证集。这种划分方式的优点是最为直接简单;缺点是只得到了一份验证集,有可能导致模型在验证集上过拟合。留出法应用场景是数据量比较大的情况。 - 交叉验证法(Cross Validation,CV)
将训练集划分成K份,将其中的K-1份作为训练集,剩余的1份作为验证集,循环K训练。这种划分方式是所有的训练集都是验证集,最终模型验证精度是K份平均得到。这种方式的优点是验证集精度比较可靠,训练K次可以得到K个有多样性差异的模型;CV验证的缺点是需要训练K次,不适合数据量很大的情况。 - 自助采样法(BootStrap)
通过有放回的采样方式得到新的训练集和验证集,每次的训练集和验证集都是有区别的。这种划分方式一般适用于数据量较小的情况。
三、模型的训练和验证
在我们前文中,已经定义了dataloader,网络,损失函数和优化器,下面是进行模型训练与验证。
- 构造训练集和验证集;
- 每轮进行训练和验证,并根据最优验证集精度保存模型。
每个epoch的训练代码:
def train(train_loader, model, criterion, optimizer, epoch):
# 切换模型为训练模式
model.train()
for i, (input, target) in enumerate(train_loader):<