deep-learning - 为什么新纪元开始时我的火车损失会下降?
问题描述
当我在 MNIST 手写数字任务上训练由 2 个卷积层和 2 个全连接层组成的神经网络时,我收到以下训练损失曲线:
数据集包含 235 个批次,我在每个批次之后绘制了总共 1500 个批次的损失,因此对模型进行了 6 个多一点的训练。使用以下 PyTorch 代码对批次进行采样:
sampler = torch.utils.data.RandomSampler(train_dataset, replacement=False)
train_dataloader = torch.utils.data.DataLoader(train_dataset, batch_size=batch_size, sampler=sampler)
因此,在每个 epoch 中,每个批次都会被查看一次,并且每个 epoch 都会对批次进行新的洗牌。正如您在图中看到的,损失在每个时期的开始都迅速减少。我以前从未见过这种行为,我想知道为什么会这样。
为了比较,当我运行相同的代码,但我选择替换采样时,我得到以下(正常外观)损失曲线:
到目前为止,我的想法是:由于在每个 epoch 开始时,之前已经查看了特定的样本,因此如果网络记住特定的批次,它可能会更容易完成任务。尽管如此,由于在每个时期都有不同的洗牌,因此网络必须记住所有批次,根据我的经验,这在 2 个时期之后不会发生。
我还在另一个数据集上进行了尝试,并使用了具有相同结果的模型变体。
我的模型结构如下:
self.conv_part = nn.Sequential(
nn.Conv2d(1, 32, (5, 5), stride=1, padding=2),
nn.ReLU(),
nn.MaxPool2d((2, 2)),
nn.Conv2d(32, 64, (5, 5), stride=1, padding=2),
nn.ReLU(),
nn.MaxPool2d((2, 2))
)
self.linear_part = nn.Sequential(
nn.Linear(7*7*64, 1024),
nn.ReLU(),
nn.Linear(1024, 10)
)
当通过显着减少每一层的通道数来简化模型时,问题几乎完全消失了,我已经标记了时期以获得更清晰的视图。
解决方案
推荐阅读
- cisco - 是否有 CISCO JTAPI 的替代品来监控 SIP 呼叫?
- python - 使用 url 直接从 python 程序打开 Whatsapp Windows 应用程序
- python - 深度学习模型在 30 次迭代后停止学习
- c# - 带有条件语句 EF 的动态包含语句
- typescript - 在 TypeScript 的另一个接口中定义一个接口的嵌套值?
- python - 表格显示在页面上时找不到“表格”
- awk - 来自日志的时间布局的 awk 语法错误
- terraform - 如何在 Terraform 中的列表(对象)变量上执行嵌套 for 循环
- google-cloud-functions - 获取“HTTP 错误:404,找不到方法。” 在 Firebase Cloud Functions 上运行“firebase deploy --only functions”时
- django - xhtml2pdf - 使用 django forloop 标签显示表格行的问题