【发布时间】:2017-11-01 13:30:25
【问题描述】:
EDIT3:你不能在本地这样做,我标记了这样说的答案。但是,对于那些好奇的人,我在下面的另一个答案中发布了一个示例解决方案。
EDIT2:下面带有问题复制的简单代码。
编辑:这不是关于如何在多个时期排队/批处理的问题,这就是重复/建议的帖子所解释的,我特别问的是如何获得不完美的批处理尺寸工作正常。那篇文章只是提到“allow_smaller_final_batch=True”参数应该解释这种情况,但似乎没有(如下面的代码所示)。
在我的 TF 神经网络中,我使用 tf.train.slice_input_producer 和 tf.train.batch 在多个时期对我的数据进行批处理,当我的批处理大小是我的样本数量的完美倍数时,它可以完美地工作。
不幸的是,如果不是这样,一个纪元的最后一批会拖到下一个纪元(即没有真正的“纪元”划分),这最终意味着每个纪元都是不同的。示例:
2 Epochs * 12 个样本 = 24 个总值,Batch_size = 5,
什么是正确的:
第 1 阶段:[5 项]、[5 项]、[2 项]
第 2 纪元:[5 项]、[5 项]、[2 项]
实际操作:
第 1 阶段:[5 项]、[5 项]、[5 项]
第 2 阶段:[5 项]、[4 项]、[0 项:超出范围]
生成上述示例的代码(与我的 NN 实现非常相似):
import tensorflow as tf
import numpy as np
batch_size = 5
epochs = 2
Data = list(range(12))
iterations = int(np.ceil(len(Data)/batch_size)*epochs)
sess = tf.InteractiveSession()
x1 = tf.train.slice_input_producer([Data], num_epochs=epochs)
x2 = tf.train.batch(x1, batch_size=batch_size, allow_smaller_final_batch=True)
sess.run(tf.global_variables_initializer())
sess.run(tf.local_variables_initializer())
coord = tf.train.Coordinator()
threads = tf.train.start_queue_runners(sess=sess,coord=coord)
for i in range(iterations):
temp_batch = sess.run(x2)
print('\n' + str(temp_batch))
sess.close()
我知道这可能只是 tf.train.slice_input_producer 工作方式的副产品,我可能可以通过各种方式手动实现/避免这种情况,但是有没有办法通过切片本地区分一个时代的“结束”?
【问题讨论】:
-
感谢 frankyjuang 的回复;这里的不同之处在于我的一般排队工作得很好(这更多是该帖子所要求的),但我没有得到该帖子中描述/暗示的重叠行为。
-
你能提供能重现这个的最小代码吗?
-
我已经在原帖中包含了代码,请看一下,谢谢=)
-
在深入研究了一些 tf 代码之后,我得出了结论。请在我的回答中找到。
标签: python tensorflow