我试图使用接口用于Dataset API。将多轮输入注入到一个图形中。
在我的首次尝试上,我使用函数使生成器连续运行3次。但是,批处理大小不是每轮迭代次数的偶数倍的打电话 (10次迭代,批大小为3),来自不同“轮次”/“纪元”的数据最终在同一批中结束(取决于处理张量的顺序;图中有一些并行性)。
在我的第二次尝试上,我尝试在每个时代完成后重新运行迭代器。但是,一旦抛出,所有对关于批处理调用的输出的后续调用都会再次抛出OutOfRangeError,即使在重新运行迭代器的初始化器之后也是如此。
我想将多轮输入依次注入到一个图中,而不是像第一个示例那样使它们重叠(例如,在批处理选项上使用allow_smaller_final_batch )。我在自定义的Tensorflow叉中实例化的一些内核重新启动非常昂贵,例如,mmap处理O文件(10‘d),因此我想从某种程度上充分利用这两个世界。
发布于 2017-08-30 20:22:11
我认为问题源于使用tf.contrib.data.Dataset (它支持重新初始化)和tf.train.batch_join() (它使用TensorFlow队列和队列运行程序,因此不支持重新初始化)。
我不完全清楚您的代码在做什么,但我认为您可以将整个管道实现为一个Dataset。替换以下代码片段:
my_iterator = MyIterator(iterations=iterations)
dataset = ds.Dataset.from_generator(my_iterator,
output_types=my_iterator.output_types,
output_shapes=my_iterator.output_shapes)
#dataset = dataset.repeat(count=repetitions)
iterator = dataset.make_initializable_iterator()
next_elem = iterator.get_next()
#change constant to 1 or 2 or something to see that the batching is more predictable
ripple_adds = [(tf.stack((next_elem[0], next_elem[1] + constant)),)
for constant in ripple_add_coefficients]
batch = tf.train.batch_join(ripple_adds, batch_size=batch_size,
enqueue_many=False, name="sink_queue")...with如下所示:
my_iterator = MyIterator(iterations=iterations)
dataset = tf.contrib.data.from_generator(my_iterator,
output_types=my_iterator.output_types,
output_shapes=my_iterator.output_shapes)
def ripple_add_map_func(x, y):
return (tf.contrib.data.Dataset.range(num_ripples)
.map(lambda r: tf.stack([x, y + r])))
dataset = dataset.flat_map(ripple_add_map_func).batch(batch_size)
iterator = dataset.make_initializable_iterator()
batch = iterator.get_next()https://stackoverflow.com/questions/45956139
复制相似问题