为啥在复制 tf.dataset 时使用 steps_per_epoch?

Posted

技术标签:

【中文标题】为啥在复制 tf.dataset 时使用 steps_per_epoch?【英文标题】:Why use steps_per_epoch when replicating a tf.dataset?为什么在复制 tf.dataset 时使用 steps_per_epoch? 【发布时间】:2019-11-20 22:56:56 【问题描述】:

我正在学习 tensorflow 并在此处查看示例代码: https://github.com/GoogleCloudPlatform/cloudml-samples/tree/master/census/tf-keras

这是一个简短的代码 sn-p 显示如何输入 model.fit 函数。

def input_fn(dataset,shuffle, n_epoch,s_batch):
    if shuffle:
        dataset = dataset.shuffle(buffer_size=10000)
    dataset = dataset.repeat(n_epochs)
    dataset = dataset.batch(s_batch)
    return dataset

n_epoch=10
s_batch=100
s_samples=number of samples in the training data

training_dataset_input=input_fn(
    training_dataset,
    shuffle=True,
    num_epochs=n_epoch,
    batch_size=s_batch)

mymodel.fit(training_dataset_input,epochs=n_epoch,steps_per_epoch=int(s_samples/s_batch)) </i>

我的问题是理解一个时代是如何运作的。我认为一个时代是整个数据集的一个完整的运行槽。但是,当设置参数 steps_per_epoch 时,训练继续在同一数据集上的位置,它似乎并没有从一开始重新开始。 那么有什么区别:

mymodel.fit(training_dataset_input,epochs=n_epoch,steps_per_epoch=int(s_samples/s_batch))

并且只是在一个时期内用尽整个复制的数据集

mymodel.fit(training_dataset_input)

这两种拟合方法都将使用整个数据集 10 次,并执行相同数量的训练步骤。

【问题讨论】:

【参考方案1】:

但是,当设置参数 steps_per_epoch 时,训练会继续在同一数据集上离开的位置,它似乎并没有从一开始重新开始。那么有什么区别呢

如果未设置steps_per_epoch,则 1 epoch 是 1 次完整的数据运行。

如果设置了steps_per_epoch,则 1“epoch”是该值设置的训练步骤数(正如您所指出的)下一个“epoch”从最后一个停止的地方开始。

如果您想在大型数据集上更频繁地进行验证运行等,此功能非常有用。

【讨论】:

非常感谢您的回答。你说的有道理。但是我仍然不明白为什么要在运行整个数据集一次之前复制数据,而不是只运行几个 epoch,其中 1 个 epoch 是数据的完整运行。 我的荣幸。如果它有帮助,您可以随时投票/接受它。请记住,您不会实际上复制/复制它。 repeat() 是一个廉价的操作,它只是以类似于运行另一个真实纪元的方式重新读取它。如果我有一个包含 250 个批次的数据集并且想要 500 个步骤,我可以只做 2 个传统时期,但如果我想要每 100 个步骤运行一次验证,那么我可以使用上面的方法来训练完全相同数量的批次,但有一个“时期”定义为 100 个批次,以便我更频繁地了解验证统计信息 对不起,我花了这么长时间才接受你的回答,我确实第一次明白如何正确地做到这一点

以上是关于为啥在复制 tf.dataset 时使用 steps_per_epoch?的主要内容,如果未能解决你的问题,请参考以下文章

tf.Dataset

Tensorflow:连接多个tf.Dataset非常慢

利用TF dataset改善模型训练效率的最佳实践

在 TF Dataset 管道中调用 Keras 标准模型预处理函数

利用TF dataset改善模型训练效率的最佳实践

利用TF dataset改善模型训练效率的最佳实践