【发布时间】:2018-11-04 06:30:57
【问题描述】:
我正在尝试将cache 转换用于dataset。这是我当前的代码(简化):
dataset = tf.data.TFRecordDataset(filenames, num_parallel_reads=1)
dataset = dataset.apply(tf.contrib.data.shuffle_and_repeat(buffer_size=5000, count=1))
dataset = dataset.map(_parser_a, num_parallel_calls=12)
dataset = dataset.padded_batch(
20,
padded_shapes=padded_shapes,
padding_values=padding_values
)
dataset = dataset.prefetch(buffer_size=1)
dataset = dataset.cache()
在第一个 epoch 之后,我收到以下错误消息:
调用迭代器没有完全读取我们正在尝试的数据集 缓存。为了避免序列的意外截断, 当前的 [部分缓存] 序列将被删除。如果发生这种情况 你有一个类似于
dataset.cache().take(k).repeat()的序列。 相反,交换订单(即dataset.take(k).cache().repeat())
然后,代码继续执行,仍然从硬盘驱动器而不是缓存中读取数据。那么,我应该在哪里放置 dataset.cache() 以避免错误?
谢谢。
【问题讨论】:
-
如何使用来自
dataset的数据?特别是,您如何确定要采取多少步骤?如果您将dataset读到最后(即当相关的迭代器引发tf.errors.OutOfRangeError),那么它应该会成功缓存。 -
谢谢,@mrry。我将尝试使用
tf.errors.OutOfRangeError来确定我的dataset的结尾。目前,我通过num_batches_per_epochs=math.ceil(num_Training_examples / batch_size)计算一个时期内的批次数。一旦批次计数达到num_batches_per_epochs,我认为一个时期已经完成并开始下一个时期(从sess.run(iterator.initializer)开始)。 -
使用
tf.errors.OutOfRangeError确定dataset的结束后,不再出现错误消息(在几个epoch 后恢复训练时也可以正常工作)。再次感谢@mrry。 -
如果我们使用
tf.errors.OutOfRangeError来判断一个dataset的结束,那么repeat转换的count应该是1,否则永远不会抛出tf.errors.OutOfRangeError。
标签: tensorflow tensorflow-datasets