neural-network - 在 Pytorch 数据加载器中使用数据混洗的影响
问题描述
我实现了一个图像分类网络,通过使用 Alexnet 作为预训练模型并更改最终输出层来对 100 个类别的数据集进行分类。我注意到当我加载我的数据时
trainloader = torch.utils.data.DataLoader(train_data, batch_size=32, shuffle=False)
,我在大约 10 个 epoch 的验证数据集上获得了大约 2-3% 的准确度,但是当我刚刚更改shuffle=True
并重新训练网络时,第一个 epoch 本身的准确度就跃升至 70%。
我想知道是否发生这种情况是因为在第一种情况下,网络在一个示例中连续显示一个示例,仅针对少数示例的一个类,导致网络在训练期间泛化能力差,或者背后有其他原因吗?
但是,我没想到会产生如此巨大的影响。
PS:除了更改 shuffle 选项外,这两种情况的所有代码和参数都完全相同。
解决方案
是的,它完全会影响结果!打乱我们用来拟合分类器的数据顺序非常重要,因为不同时期之间的批次看起来并不相似。
检查数据加载器文档,它说:“shuffle (bool, optional) – 设置为 True 让数据在每个时期都重新洗牌”
无论如何,它将使模型更加健壮并避免过度/欠拟合。
在您的情况下,准确性的大幅提高(由于缺乏对数据集的认识)可能是由于数据集是如何“组织”的,例如,每个类别都属于不同的批次,并且在每个时期,一个batch 包含相同的类别,这在您进行测试时会导致非常差的准确性。
推荐阅读
- sql - 通过值是否可以转换为日期来过滤 nvarchar 列?
- ms-access - 将字符串的 Access 字段格式化为时间
- android - Flutter:如何在Java文件中使用“Dart语言”定义的类文件?
- android - Nativescript 库对于 Android 来说太大了
- ruby-on-rails - 如何在 Rails 6 中使用多个根路由?
- r - 选择组中的最后一个非同期日期
- php - PHP 数组到 CSV 下载 - 第一列标题中的不需要的数据
- javascript - Madcap Flare 11 - HTML5 输出引发 requirejs 错误 - 不匹配的匿名定义()模块:函数(C
- java - Spring Boot 应用程序使用的 Dockerfile 在哪里?
- azure-cosmosdb - 在 Cosmos DB 中的数字序列中查找最小缺失值