【问题标题】:How to checkpoint tf.data Dataset objects?如何检查 tf.data 数据集对象?
【发布时间】:2018-05-11 01:13:24
【问题描述】:

在训练期间检查点时(以防崩溃/等)我保存了图形和参数,但不清楚如何对用于输入的新 tf.data 对象执行相同操作。

是否有一种简单的方法来检查这些点,以便我可以继续当前的 epoch,或恢复 shuffle 状态(可能来自种子?)

【问题讨论】:

  • 对于非洗牌数据集,您似乎可以保存全局调用的数量,并有一个一次性操作来“寻找”数据集到您所在的位置,但这会出现在窗口之外.shuffle().
  • machinaut:不过,对于大型数据集,这可能非常慢。
  • 下面这位可敬的 mrry 的解决方案对您有用吗?我也对恢复训练而不重复当前时期内看到的数据非常感兴趣。谢谢。

标签: tensorflow tensorflow-datasets


【解决方案1】:

tf.contrib.data.make_saveable_from_iterator() 函数接受 tf.data.Iterator 对象并返回一个“可保存对象”,可以使用 tf.train.Saver 保存该对象。它保存了迭代器的整个状态,包括任何打乱的数据。

以下示例代码显示了如何将简单的迭代器添加到用于变量的同一检查点:

ds = tf.data.Dataset.range(10)
iterator = ds.make_initializable_iterator()

# [Build the training graph, using `iterator.get_next()` as the input.]

# Build the iterator SaveableObject.
saveable_obj = tf.contrib.data.make_saveable_from_iterator(iterator)

# Add the SaveableObject to the SAVEABLE_OBJECTS collection so
# it will be saved automatically using a Saver.
tf.add_to_collection(tf.GraphKeys.SAVEABLE_OBJECTS, saveable_obj)

# Create a saver that saves all objects in the `tf.GraphKeys.SAVEABLE_OBJECTS`
# collection.
saver = tf.train.Saver()

with tf.Session() as sess:
  while continue_training:

    # [Perform training.]

    if should_save_checkpoint:
      saver.save(sess, ...)

请注意,迭代器检查点支持目前(从 TensorFlow 1.8 开始)处于实验状态,因此检查点格式可能会从一个版本更改为下一个版本。

【讨论】:

  • 谢谢@mrry。我设法使用以下代码 sn-p 使其在单个工作人员上工作: iterator = data_set.make_initializable_iterator() # 保存数据集状态。 saveable_obj = tf.contrib.data.make_saveable_from_iterator(iterator) tf.add_to_collection(tf.GraphKeys.SAVEABLE_OBJECTS, saveable_obj) tf.add_to_collection(tf.GraphKeys.TABLE_INITIALIZERS, iterator.initializer),但是这在分布式设置中有效吗?使用 inspect_checkpoint 我只看到一个 iterator_state 变量,Iterator:0-state (DT_VARIANT) []。
  • 亲爱的 mrry:我今天检查了一下,即使对于单工作人员非分布式模式,这也不起作用。我所做的是创建一个包含 1000 个示例的虚拟 tfrecord 文件,其中 int64 标签枚举 0 到 999,并在训练期间使用 tf.Print 标签。用100个样本训练了一个初始模型后,我重新开始训练,没有删除checkpoint,但是标签张量的tf.Print输出仍然是0~100。
  • 刚刚意识到我需要将您的用户标签放在前面,以便系统正常使用。请看我上面的最后一个问题(我认为一旦找出单个工人的情况,我就有办法在分布式环境中做到这一点)。很抱歉收到垃圾邮件。
猜你喜欢
  • 1970-01-01
  • 2018-03-19
  • 2021-09-21
  • 1970-01-01
  • 2019-05-24
  • 2015-04-20
  • 2021-12-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多