在 TensorFlow 中,步骤和时代之间的区别是什么?

在大多数模型中,有一个指示 运行数据的步骤数步骤参数。但是我看到在大多数实际应用中,我们也执行拟合函数 N 时代

用一个纪元跑1000步和用10个纪元跑100步有什么区别?哪一个在实践中更好?在连续的时代之间有什么逻辑变化吗?数据重组?

136146 次浏览

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

人们经常在不同时代之间对数据集进行处理。我更喜欢使用 Random. sample 函数来选择在我的时代要处理的数据。假设我想做1000个步骤,批量大小为32。我会从训练数据库中随机抽取32000个样本。

一个训练步骤是一个渐变更新,在一个步骤中处理 batch_size示例。

一个新纪元包括一个完整的训练数据循环。这通常需要很多步骤。举个例子,如果你有2000张图片并且使用10个批量大小,那么一个纪元包括:

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

如果你在每个步骤中随机地(独立地)选择你的训练图像,你通常不会称之为时代。[这就是我的答案与前一个不同的地方。也可以看看我的评论。]

因为我目前正在试验 tf.Estiator API,所以我也想在这里添加我的新发现。我还不知道整个 TensorFlow 中的 step 和 epoch 参数的使用是否一致,因此我只关心 tf.Estiator (特别是 tf.Estiator)。线性回归)。

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=1作为训练输入,而 numpy_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 _ sizeX _ train. size = 700,000批量 _ 大小 = 4) ,这正是步骤 estimator.train的数量,尽管 step 参数被设置为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

结论 : 无论 tf.estimator.inputs.numpy_input_fnnum_epochs参数和 estimator.trainsteps参数如何定义,下限决定了将要运行的步骤数。

简单地说
Epoch: Epoch 被认为是来自整个数据集的一次传递数
步骤: 在张量流中,一个步骤被认为是时代数乘以例子除以批量大小

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

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

步骤: 训练步骤意味着使用一批训练数据来训练模型。

每个纪元的训练步数: total_number_of_training_examples/batch_size

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

因为还没有公认的答案: 默认情况下,在所有训练数据上运行一个新纪元。在这种情况下,有 n 个步骤,n = Training _ length/batch _ size。

如果你的训练数据太大,你可以决定限制一个时代的步数

当步骤数达到您设置的限制时,该过程将重新开始,开始下一个纪元。 在 TF 中工作时,通常首先将数据转换为一个批处理列表,这些批处理将提供给模型进行培训。在每个步骤中处理一批产品。

至于是为一个纪元设置1000个步骤更好,还是为10个纪元设置100个步骤更好,我不知道是否有一个直接的答案。 但下面是使用 TensorFlow 时间序列数据教程对 CNN 进行两种训练的结果:

在这种情况下,两种方法导致非常相似的预测,只是训练轮廓不同。

步骤 = 20/纪元 = 100 enter image description here

enter image description here

步骤 = 200/纪元 = 10

enter image description here

enter image description here

根据 谷歌机器学习词汇,一个纪元被定义为

对整个数据集进行完整的训练,以便每个示例只被看到一次。因此,一个纪元表示 N/batch_size训练迭代,其中 N 是示例的总数。

如果你是 10个纪元批号6的训练模型,给定总 12个样本意味着:

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

  2. 总的来说,模型将有2 × 10 = 20次迭代(每一纪元的迭代 X 无纪元)

  3. 损失和模型参数的重新评估将在每次迭代后执行!

x_train的长度除以批量大小

steps_per_epoch = x_train.shape[0] // batch_size