【问题标题】:dataset.repeat() will cause the infinite loop?dataset.repeat() 会导致死循环吗?
【发布时间】:2021-05-06 01:54:05
【问题描述】:

我正在通过阅读官方文档来学习 TensorFlow。但被这一行弄糊涂了:

dataset = dataset.shuffle(1000).repeat()

我尝试运行整个项目,它实际上可以工作。但我不明白为什么它不会进入由 dataset.repeat() 引起的无限循环,因为你没有分配计数,所以它会无限重复。

希望有人能帮我解决这个问题吗?

这里是这行代码的链接:https://www.tensorflow.org/tutorials/estimator/premade

部分是“定义特征列”,整个代码块复制如下:

    """An input function for training or evaluating"""
    # Convert the inputs to a Dataset.
    dataset = tf.data.Dataset.from_tensor_slices((dict(features), labels))

    # Shuffle and repeat if you are in training mode.
    if training:
        dataset = dataset.shuffle(1000).repeat()

    return dataset.batch(batch_size)```
 

【问题讨论】:

  • 非常感谢,我明白你的意思了。我仍然想知道这样做有什么好处,而不是像 repeat(500) 或其他那样直接分配计数? (也许通过分配总步骤来限制计数更优雅,因为它允许在预期计算中尽可能多地打乱数据?这只是我的猜测)
  • 我把我的 cmets 变成了答案 :)

标签: python-3.x tensorflow dataset


【解决方案1】:

确实进入了一个无限循环。如果您想知道如何完成培训,文档表明步骤参数已在

中提供
classifier.train(input_fn=lambda: input_fn(train, train_y, training=True), steps=5000) 

所以即使循环是无限的,优化器也知道要执行多少步。

至于为什么要这样做的问题...我认为这是个人喜好问题,但是,在某些情况下这可能非常有用。让我们看看生成tf.data.Dataset 用于训练和测试的函数:

def input_fn(features, labels, training=True, batch_size=256):
    """An input function for training or evaluating"""
    # Convert the inputs to a Dataset.
    dataset = tf.data.Dataset.from_tensor_slices((dict(features), labels))

    # Shuffle and repeat if you are in training mode.
    if training:
        dataset = dataset.shuffle(1000).repeat()

    return dataset.batch(batch_size)

现在,假设您想研究批量大小如何影响模型的学习方式。为了比较具有不同批量大小的模型并保持公平,您应该允许每个模型进行相同数量的迭代(权重更新)。区别应该是具有更大批量大小的模型将更好地近似整个数据集的梯度。使用上述教程中的设置很容易做到。您只需更改input_fn 中的batch_size 参数,并且由于步骤数是恒定的,因此您的管道已准备就绪。尝试以另一种方式来做可能会很痛苦

【讨论】:

    猜你喜欢
    • 2012-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-01
    • 1970-01-01
    • 2021-03-14
    • 2015-06-08
    • 2015-05-20
    相关资源
    最近更新 更多