循环训练中少了一批?

2024-03-29 14:41:42 发布

您现在位置:Python中文网/ 问答频道 /正文

  • 数据有n_rows
  • 批大小是batch_size

我看到一些code用法:

n_batches = int(n_rows / batch_size)

如果n\u行不是批量大小的倍数呢? n_batches仍然正确吗?你知道吗


Tags: 数据用法sizebatchcodebatches批量rows
1条回答
网友
1楼 · 发布于 2024-03-29 14:41:42

事实上,您可以在一些代码中看到这一点,而且我们知道标记的数据非常有价值,因此您不想丢失一些宝贵的标记示例。乍一看,它看起来像一个bug,似乎我们失去了一些训练示例,但我们必须仔细看看代码。你知道吗

通常,当您看到这一点时,就像您发送的代码一样,在每个历元(基于一个历元看到n_batches = int(n_rows / batch_size)示例的事实),数据在每个历元之后被洗牌。因此,经过一段时间(几个时代之后),您将看到所有您的培训示例。我们没有丢失任何示例\o/

小结论:如果您看到了这一点,请确保数据在每个历元都被洗牌,否则您的网络可能永远看不到一些训练示例。你知道吗

这样做有什么好处?

效率很高: 通过使用此机制,您可以确保在每个培训步骤中,您的网络将看到批量大小的示例,并且您不会使用少量的培训示例执行培训循环。你知道吗

更为严格:假设你只剩下一个例子,而你没有洗牌。在每个时期,假设你的损失是该批的平均损失,对于最后一个例子,它将相当于有一个由一个元素组成的批重复batch_size次,它将像加权这个例子有更多的重要性。如果你洗牌,这个效果会降低(因为剩下的例子会随着时间的推移而改变),但是在你的训练期间保持一个恒定的批量大小更为严格。你知道吗

在培训期间对数据进行洗牌也有一些好处,请参见: statexchange post

我还要补充一点,如果您使用诸如批处理规范化之类的机制,最好在训练期间保持恒定的批处理大小,例如,如果n_rows % batch_size = 1,在训练期间将单个示例传递为Batch,可能会产生一些麻烦。你知道吗

注意: 我说的是在一个训练周期内,而不是在整个训练周期(多个周期)内保持不变的批量大小,因为即使通常情况是这样(在整个训练过程中保持不变),您也可以找到一些在训练期间修改批大小的研究工作,例如Don't Decay the Learning Rate, Increase the Batch Size。你知道吗

相关问题 更多 >