Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/288.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 循环训练中缺少一批? 数据有n行行 批次大小为batch\u size_Python_Tensorflow - Fatal编程技术网

Python 循环训练中缺少一批? 数据有n行行 批次大小为batch\u size

Python 循环训练中缺少一批? 数据有n行行 批次大小为batch\u size,python,tensorflow,Python,Tensorflow,我看到了一些用途: 如果n_行不是批量大小的倍数怎么办? n\u批处理是否仍然正确?事实上,您可以在一些代码中看到这一点,我们知道标记的数据非常有价值,因此您不想丢失一些宝贵的标记示例。乍一看,它看起来像一个bug,似乎我们正在丢失一些训练示例,但我们必须仔细查看代码 通常,当您在每个历元(基于一个历元看到n\u batches=int(n\u rows/batch\u size)示例)看到这一点时,就像在发送的代码中一样,数据在每个历元后都会被洗牌。因此,经过一段时间(在几个时代之后),您将看

我看到了一些用途:

如果n_行不是批量大小的倍数怎么办?
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设置为True
batch(batch\u size,drop\u rements=False)
n_batches = int(n_rows / batch_size)