Python 循环训练中缺少一批? 数据有n行行 批次大小为batch\u size
我看到了一些用途: 如果n_行不是批量大小的倍数怎么办?Python 循环训练中缺少一批? 数据有n行行 批次大小为batch\u size,python,tensorflow,Python,Tensorflow,我看到了一些用途: 如果n_行不是批量大小的倍数怎么办? n\u批处理是否仍然正确?事实上,您可以在一些代码中看到这一点,我们知道标记的数据非常有价值,因此您不想丢失一些宝贵的标记示例。乍一看,它看起来像一个bug,似乎我们正在丢失一些训练示例,但我们必须仔细查看代码 通常,当您在每个历元(基于一个历元看到n\u batches=int(n\u rows/batch\u size)示例)看到这一点时,就像在发送的代码中一样,数据在每个历元后都会被洗牌。因此,经过一段时间(在几个时代之后),您将看
n\u批处理
是否仍然正确?事实上,您可以在一些代码中看到这一点,我们知道标记的数据非常有价值,因此您不想丢失一些宝贵的标记示例。乍一看,它看起来像一个bug,似乎我们正在丢失一些训练示例,但我们必须仔细查看代码
通常,当您在每个历元(基于一个历元看到n\u batches=int(n\u rows/batch\u size)
示例)看到这一点时,就像在发送的代码中一样,数据在每个历元后都会被洗牌。因此,经过一段时间(在几个时代之后),您将看到所有的培训示例。我们没有丢失任何示例\o/
小结论:如果您看到了这一点,请确保数据在每个历元都被洗牌,否则您的网络可能永远看不到一些训练示例
这样做有什么好处?
它是高效的:
通过使用此机制,您可以确保在每个培训步骤中您的网络将看到批量大小示例,并且您不会使用少量培训示例执行培训循环
更为严格的是:假设您只剩下一个示例,并且您没有洗牌。在每个时期,假设您的损失是该批次的平均损失,对于最后一个示例,它将相当于有一个由一个元素组成的批次重复batch\u size
时间,这将类似于对该示例进行加权以获得更大的重要性。如果你洗牌,这个效果会降低(因为剩下的例子会随着时间的推移而改变),但是在你的训练期间保持一个恒定的批量大小更为严格
在培训期间洗牌数据还有一些好处,请参见:
我还要补充一点,如果您使用诸如批处理规范化之类的机制,最好在培训期间保持恒定的批处理大小,例如,如果n_行%Batch_size=1
,则在培训期间将单个示例作为批处理传递可能会产生一些问题
注:
我所说的是在一个训练周期内,而不是在整个训练周期内(多个训练周期),恒定的批量大小,因为即使通常是这样(在整个训练过程中保持恒定),您可以找到一些在培训期间修改批大小的研究工作,例如,当我查看
one_shot_iterator()
的行为时,我认为n_batch
实际上应该是n_rows//batch_size
的倍数,前提是n_rows
是batch_size
的倍数。如果n\u行
不是batch\u size
的倍数,则对于每个1+n\u行//batch\u size
批次,最后一个批次的行数少于其他批次。我使用相同的迭代器来训练多个网络。迭代器生成无序数据。如果n\u行
不是batch\u大小
的倍数,迭代器不会生成具有恒定大小的批。我可以手动丢弃最后一批较短的批,使所有批都具有恒定的大小。我想,默认情况下,它可以避免在评估时丢失一些示例,但对于培训,可以使用shuffle+repeat+batch,并将drop rements设置为Truebatch(batch\u size,drop\u rements=False)
n_batches = int(n_rows / batch_size)