欢迎光临散文网 会员登陆 & 注册

K折交叉验证 | 深度学习入门必读系列5

2021-08-16 18:22 作者:深度之眼官方账号  | 我要投稿

如果你是自学的深度学习,没有系统的梳理过整个学习步骤会感觉很混乱,衔接不上。学姐整理的“用pytorch构建多种类型模型来帮助学习深度学习”系列教程就是为了让大家打好基础,每一个知识点都能衔接上。(你们有什么想看的评论区告诉我啊!)


今天是系列教程的第五节《K折交叉验证》,大家要继续保持积极性嗷!



深度学习入门必读系列前4篇传送门


1.Pytorch初学者教程

2.了解深度学习模型中的张量维度

3.CNN和特征可视化

4.使用Optuna调整超参数


0K折交叉验证介绍


K fold Cross Validation(K折交叉验证)是一种用于以稳健的方式评估机器学习或深度学习模型的性能的技术。

  • 它将数据集分成大小大致相同的k个部分/折叠(parts/folds)。依次选择每个folds进行测试,其余parts进行训练。

  • 这个过程重复k次,然后将性能作为所有测试集的平均值进行测量。

02 使用Pytorch和sklearn实现步骤


K折交叉验证用于评估CNN模型在MNIST数据集上的性能。该方法使用sklearn库实现,而模型使用Pytorch进行训练。


导入库和数据集


我们定义了具有2个卷积层和1个全连接层的卷积神经网络架构,以将图像分类为十个类别之一。我们在模型中添加了两个Dropout层,以限制过度拟合的风险。


为分类初始化交叉熵损失函数,在代码上使用GPU并设置一个固定的随机数种子。


然后将训练集和测试集连接成一个应用该ConcatDataset函数的唯一数据集。


我们使用该Kfold函数生成10折,其中我们有随机拆分和可复制的结果random_state=42。因此,它将数据集分为9部分用于训练,其余部分用于测试。


在应用K折交叉验证之前,定义了用于训练和评估模型的函数。特别是在训练函数时,执行前向传递和后向传递。

现在,通过迭代折叠来构建k折叠验证过程。


在第一个for循环中,从train_idx和val_idx中采样元素,然后将这些采样器转换为批大小等于128的DataLoader对象,初始化模型并将其传递给GPU,最后以0.002作为学习率来初始化Adam优化器。


在第二个循环中,我们通过之前定义的函数训练和评估CNN模型,这些函数将返回所选训练集和测试集的损失和准确度。


我们把所有的执行都保存到命名为history的字典里。在模型的训练和评估结束后,特定折叠(进入history字典)的所有分数都存储在字典中foldperf。


使用torch.save函数存储模型



我们可以看到最后两折的表现,结果看起来相当不错——在训练和测试集中都有99%的准确率。此外,训练和测试精度之间没有明显差异,证明没有过度拟合。


我们可以通过两个步骤计算平均性能以获得更全面的概述:


  • 计算每个折叠的平均分数。


  • 获得每个折叠的平均分数后,计算所有折叠的平均分数。


正如之前的一样,这里没有进行任何平均计算就获得了很好的结果。


为了进一步确认,我们可以绘制CNN模型十个交叉验证折叠的平均损失/准确度曲线。在前4个epoch中,准确度增加非常快,而损失函数达到非常低的值。两条曲线在 10 个 epoch 后汇合。



03 总结


当你学完这篇教程,你可能就可以使用Pytorch定义的模型实现K折交叉验证。本篇教程的实现步骤还是相对简单的,问题的类型,部分数据,也有一些变化。例如,其他一些方法是分层K折交叉验证和时间序列交叉验证。


本教程部分代码:

https://github.com/eugeniaring/Pytorch-tutorial/blob/main/KCV_mnist.ipynb


原文链接:

https://medium.com/dataseries/k-fold-cross-validation-with-pytorch-and-sklearn-d094aa00105f

下期预告:

深入研究k折交叉验证(K fold Cross Validation)


关注公众号提前看好文!



K折交叉验证 | 深度学习入门必读系列5的评论 (共 条)

分享到微博请遵守国家法律