n_rows
行batch_size
我看到一些code的用法:
n_batches = int(n_rows / batch_size)
如果n_rows不是批处理大小的倍数怎么办?
n_batches
仍然正确吗?
答案 0 :(得分:1)
实际上,您可以在几个代码中看到这一点,并且我们知道标记的数据非常有价值,因此您不想丢失一些珍贵的标记示例。乍一看,它看起来像是个错误,看来我们正在丢失一些培训示例,但我们必须仔细看一下代码。
通常情况下,如您在发送代码中看到的那样,在每个时期(基于一个时期正在看到n_batches = int(n_rows / batch_size)
个示例的事实),数据在每个时期之后都会被重新整理。因此,随着时间的推移(经过几个时期),您会看到全部培训示例。我们不会丢失任何示例\ o /
小结论:如果看到这样的情况,请确保在每个时期都对数据进行混洗,否则您的网络可能永远不会看到一些训练示例。
高效: 通过使用这种机制,您可以确保在每个培训步骤中,您的网络都可以看到 batch_size 示例,并且您不会执行包含少量培训示例的培训循环。 / p>
它更加严格:假设您还有一个示例,但您不会洗牌。在每个时期,假设您的损失是该批次的平均损失,那么对于最后一个示例,它等效于一个批次包含一个重复batch_size
次的元素,这就像对这个示例进行加权重要性。如果您改组,此效果会降低(因为其余示例会随时间而变化),但是在训练期间保持批量大小恒定更为严格。
在训练过程中对数据进行混洗还有一些优点,请参见: statexchange post
我还将在帖子中补充说,如果您使用的是诸如批处理规范化之类的机制,那么在训练过程中最好具有恒定的批处理大小,例如n_rows % batch_size = 1
,将一个示例作为批处理传递< strong>在培训期间可能会造成一些麻烦。
注意: 我说的是在训练时期而不是在整个训练周期(多个时期)中保持不变的批次大小,因为即使通常是这样(在整个训练过程中都保持不变),您仍可以找到一些研究工作来修改培训期间的批次大小,例如Don't Decay the Learning Rate, Increase the Batch Size。