TensorFlow 中的 step 和 epoch 有啥区别?

Posted

技术标签:

【中文标题】TensorFlow 中的 step 和 epoch 有啥区别?【英文标题】:What is the difference between steps and epochs in TensorFlow?TensorFlow 中的 step 和 epoch 有什么区别? 【发布时间】:2016-11-15 08:53:14 【问题描述】:

在大多数模型中,都有一个 steps 参数指示运行数据的步数。但是我看到在大多数实际使用中,我们也执行了拟合函数 N epochs

用 1 个 epoch 跑 1000 步和用 10 个 epoch 跑 100 步有什么区别?哪一个在实践中更好?连续时期之间的任何逻辑变化?数据洗牌?

【问题讨论】:

Jason Brownlee 在 machinelearningmastery.com 上,detailed answer 正好回答了这个问题。 【参考方案1】:

一个时期通常意味着对所有训练数据进行一次迭代。例如,如果您有 20,000 张图像和 100 的批量大小,那么 epoch 应该包含 20,000 / 100 = 200 步。但是,即使我有一个更大的数据集,我通常只设置固定数量的步骤,例如每个 epoch 1000。在时代结束时,我检查平均成本,如果它有所改善,我会保存一个检查点。从一个时代到另一个时代的步骤之间没有区别。我只是把它们当作检查点。

人们经常在不同时期之间对数据集进行洗牌。我更喜欢使用 random.sample 函数来选择要在我的时代处理的数据。假设我想做 1000 步,批量大小为 32。我将从训练数据池中随机挑选 32,000 个样本。

【讨论】:

我认为您的答案的第二部分是错误的。一个 epoch 被定义为通过训练数据的一个周期。如果您固定步数,这不是一个时代。类似地,如果您在每个步骤中独立地对训练示例进行采样,则不能将其称为 epoch。您可以保存您的检查点并每 N Steps 进行一次检查,但这并不意味着 N Steps 成为一个 epoch。我会避免在代码中调用这个时代,它有可能造成混淆。【参考方案2】:

一个训练步骤是一个梯度更新。在一个步骤中处理batch_size 示例。

一个时期由一个完整的训练数据周期组成。这通常是很多步骤。例如,如果您有 2,000 张图像并使用 10 的批量大小,则一个 epoch 包括:

2,000 images / (10 images / step) = 200 steps.

如果您在每一步中随机(且独立)选择训练图像,通常不会将其称为 epoch。 [这是我的答案与上一个不同的地方。另请参阅我的评论。]

【讨论】:

我对 200 步计算进行了编辑但忘记登录,所以如果您想与“未知用户”交谈...我在这里【参考方案3】:

由于我目前正在试验 tf.estimator API,我也想在这里添加我的发现。我还不知道整个 TensorFlow 中 step 和 epochs 参数的使用是否一致,因此我现在只与 tf.estimator(特别是 tf.estimator.LinearRegressor)有关。

num_epochs 定义的训练步骤:steps 未明确定义

estimator = tf.estimator.LinearRegressor(feature_columns=ft_cols)
train_input =  tf.estimator.inputs.numpy_input_fn('x':x_train,y_train,batch_size=4,num_epochs=1,shuffle=True)
estimator.train(input_fn=train_input)

评论:我为训练输入设置了num_epochs=1numpy_input_fn 的文档条目告诉我“num_epochs:整数,迭代数据的时期数。如果None 将永远运行。” 。在上面的例子中,num_epochs=1 训练运行精确 x_train.size/batch_size 次/步(在我的例子中,这是 175000 步,因为 x_train 的大小为 700000,batch_size 为 4 )。

num_epochs 定义的训练步数:steps 显式定义的步数高于num_epochs=1 隐式定义的步数

estimator = tf.estimator.LinearRegressor(feature_columns=ft_cols)
train_input =  tf.estimator.inputs.numpy_input_fn('x':x_train,y_train,batch_size=4,num_epochs=1,shuffle=True)
estimator.train(input_fn=train_input, steps=200000)

评论:num_epochs=1 在我的情况下意味着 175000 步(x_train.size/batch_size x_train.size=700,000batch_size=4 em>) 这正是步数estimator.train,尽管steps 参数设置为200,000 estimator.train(input_fn=train_input, steps=200000)

steps定义的训练步骤

estimator = tf.estimator.LinearRegressor(feature_columns=ft_cols)
train_input =  tf.estimator.inputs.numpy_input_fn('x':x_train,y_train,batch_size=4,num_epochs=1,shuffle=True)
estimator.train(input_fn=train_input, steps=1000)

评论:虽然我在调用numpy_input_fn时设置了num_epochs=1,但训练在1000步后停止。这是因为estimator.train(input_fn=train_input, steps=1000) 中的steps=1000 覆盖了tf.estimator.inputs.numpy_input_fn('x':x_train,y_train,batch_size=4,num_epochs=1,shuffle=True) 中的num_epochs=1

结论: 无论num_epochs 用于tf.estimator.inputs.numpy_input_fnsteps 用于estimator.train 定义的参数是什么,下限都决定了将运行的步数。

【讨论】:

【参考方案4】:

简单来说 Epoch: Epoch 被认为是整个数据集的一次传递数 步骤: 在 tensorflow 中,一个步骤被认为是时期数乘以示例除以批量大小

steps = (epoch * examples)/batch size
For instance
epoch = 100, examples = 1000 and batch_size = 1000
steps = 100

【讨论】:

Umar,我使用您的公式得到了更好的结果,但只是想知道为什么每个人都有不同的公式?就像上面其他人所说的那样,步数 =(图像总数)/批量大小。 @SatyendraSahani 我从 coursera 提供的 GCP 课程的一位讲师那里得到了这个公式,可能是这种情况你得到了更好的结果。 @Umar,但有时样本数量很大。就像在我们的案例中一样,我们有 99,000 个样本。如果我们选择批量大小 8 和 epochs 20。总 step_size 的数量为 (20*99000)/8 = 247,500。这确实是一个很高的数字。我开始怀疑这种方法。【参考方案5】:

Epoch:一个训练epoch代表完全使用所有训练数据进行梯度计算和优化(训练模型)。

步骤:训练步骤是指使用一批训练数据来训练模型。

每个 epoch 的训练步数:total_number_of_training_examples / batch_size

训练步骤总数:number_of_epochs x Number of training steps per epoch

【讨论】:

补充一点,如果有一个大小为V的验证集,那么每个epoch的训练步数是(total_number_of_training_examples - V)/batch_size【参考方案6】:

由于还没有公认的答案: 默认情况下,一个纪元会遍历所有训练数据。在这种情况下,您有 n 个步骤,其中 n = Training_lenght / batch_size。

如果您的训练数据太大,您可以决定限制一个时期内的步数。[https://www.tensorflow.org/tutorials/structured_data/time_series?_sm_byp=iVVF1rD6n2Q68VSN]

当步数达到您设置的限制时,流程将重新开始,开始下一个 epoch。 在 TF 中工作时,您的数据通常首先被转换为批次列表,这些批次将被馈送到模型进行训练。在每个步骤中,您处理一个批次。

至于设置 1 epoch 1000 step 好还是 10 epoch 设置 100 step 好,我不知道有没有直接的答案。 但这里是使用 TensorFlow 时间序列数据教程使用这两种方法训练 CNN 的结果:

在这种情况下,这两种方法都会导致非常相似的预测,只是训练配置文件不同。

步数 = 20 / 时期 = 100

步数 = 200 / 时期 = 10

【讨论】:

【参考方案7】:

根据Google's Machine Learning Glossary,一个epoch定义为

"对整个数据集进行一次完整的训练,这样每个示例都被看到一次。因此,一个 epoch 代表N/batch_size 个训练迭代,其中 N 是示例的总数。"

如果您使用 batch size 6 训练 10 个 epochs 的模型,给定总共 12 个样本,这意味着:

    模型将能够在 2 次迭代 (12 / 6 = 2) 即单个 epoch 中看到整个数据集。

    总体而言,该模型将有 2 X 10 = 20 次迭代(每轮迭代次数 X 轮次次数)

    每次迭代后都会重新评估损失和模型参数!

【讨论】:

【参考方案8】:

x_train 的长度除以批量大小

steps_per_epoch = x_train.shape[0] // batch_size

【讨论】:

以上是关于TensorFlow 中的 step 和 epoch 有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

tensorflow在文本处理中的使用——词袋

当TensorFlow中的学习率下降时,应该何时设置楼梯是真的?

TensorFlow经典案例4:实现logistic回归

First Steps with TensorFlow代码解析

Tensorflow1.0 和 Tensorflow2.0—— 区别

Tensorflow 中的生成序列