tf.data.Datasets.repeat(EPOCHS) 与 model.fit epochs=EPOCHS 之间的区别

Posted

技术标签:

【中文标题】tf.data.Datasets.repeat(EPOCHS) 与 model.fit epochs=EPOCHS 之间的区别【英文标题】:Difference between tf.data.Datasets.repeat(EPOCHS) vs model.fit epochs=EPOCHS 【发布时间】:2021-06-07 23:31:13 【问题描述】:

在训练时,我将 epoch 设置为迭代数据的次数。我想知道tf.data.Datasets.repeat(EPOCHS) 的用途是什么,而我已经可以用model.fit(train_dataset,epochs=EPOCHS) 做同样的事情?

【问题讨论】:

【参考方案1】:

它的工作方式略有不同。

让我们选择 2 个不同的例子。

    dataset.repeat(20) 和 model.fit(epochs=10) dataset.repeat(10) 和 model.fit(epochs=20)

我们还假设您有一个包含 100 条记录的数据集。

如果您选择选项 1,每个 epoch 将有 2,000 条记录。在通过模型传递 2,000 条记录后,您将“检查”模型的改进情况,您将这样做 10 次。

如果您选择选项 2,每个 epoch 将有 1,000 条记录。在推送 1,000 条记录后,您将评估您的模型如何改进,您将这样做 20 次。

在这两个选项中,您将用于训练的记录总数相同,但您评估、记录等模型行为的“时间”不同。

【讨论】:

能否更详细地解释最后一行?对于 2 个示例,模型的最终指标(如准确性)会改变还是保持不变?我认为它应该保持不变 如果您的模型是相同的,并且您没有某些东西,例如应该在训练时引入随机性的 dropout 层,并假设您的批量大小也相同,因此梯度将相同,是的,准确度是一样的。唯一的区别是当你检查你的训练进展情况时。有意义吗?【参考方案2】:

tf.data.Datasets.repeat() 在图像数据的情况下可用于tf.data.Datasets 上的数据增强。

假设您想增加训练数据集中的图像数量,使用随机变换然后重复训练数据集count 次并应用随机变换,如下所示

train_dataset = (
    train_dataset
    .map(resize, num_parallel_calls=AUTOTUNE)
    .map(rescale, num_parallel_calls=AUTOTUNE)
    .map(onehot, num_parallel_calls=AUTOTUNE)
    .shuffle(BUFFER_SIZE, reshuffle_each_iteration=True)
    .batch(BATCH_SIZE)
    .repeat(count=5)
    .map(random_flip, num_parallel_calls=AUTOTUNE)
    .map(random_rotate, num_parallel_calls=AUTOTUNE)
    .prefetch(buffer_size=AUTOTUNE)
)

如果没有 repeat() 方法,您必须创建数据集的副本,单独应用转换,然后连接数据集。但是使用repeat() 简化了这一点,还利用了方法链接,并且代码看起来很整洁。

有关数据增强的更多信息:https://www.tensorflow.org/tutorials/images/data_augmentation#apply_augmentation_to_a_dataset

【讨论】:

以上是关于tf.data.Datasets.repeat(EPOCHS) 与 model.fit epochs=EPOCHS 之间的区别的主要内容,如果未能解决你的问题,请参考以下文章

make 模板

理解 e.clientX,e.clientY e.pageX e.pageY e.offsetX e.offsetY

理解 e.clientX,e.clientY e.pageX e.pageY e.offsetX e.offsetY

理解 e.clientX,e.clientY e.pageX e.pageY e.offsetX e.offsetY

理解 e.clientX,e.clientY e.pageX e.pageY e.offsetX e.offsetY

如何提取e人e本手写办公系统软件