TensorFlow中的步骤和纪元有什么区别?


125

在大多数模型中,都有一个steps参数,指示要运行数据的步骤数。但是,我发现在最实际的用法中,我们还执行了拟合函数N epochs

以1个时间段运行1000个步和以10个时间段运行100个步有什么区别?在实践中哪一个更好?连续纪元之间有逻辑变化吗?数据改组?


1
machinelearningmastery.com上的杰森·布朗利Jason Brownlee)对这个问题有很好的详细解答
BmyGuest

Answers:


84

历元通常意味着对所有训练数据进行一次迭代。例如,如果您有20,000张图像且批处理大小为100,则纪元应包含20,000 / 100 = 200步。但是,即使我拥有更大的数据集,我通常也只设置固定的步骤数(例如每个时期1000)。在该阶段结束时,我检查平均费用,如果费用有所改善,则保存一个检查点。从一个纪元到另一个纪元的步骤之间没有区别。我只是把它们当作检查站。

人们经常在各个时期之间围绕数据集洗牌。我更喜欢使用random.sample函数来选择要在我的时代处理的数据。假设我想以32个批次的大小执行1000个步骤。我将从训练数据池中随机抽取32,000个样本。


47
我认为您回答的第二部分是错误的。一个时期被定义为训练数据的一个周期。如果您确定步骤数,这不是一个时代。类似地,如果您在每个步骤中都单独对训练示例进行采样,则您无法将其称为时期。您可以保存检查点并每N个步骤进行一次检查,但这并不意味着N个步骤成为一个纪元。我会避免在代码中调用此时期,它可能会造成混淆。
MarvMind

84

训练步骤是一个梯度更新。第一步,处理了很多示例。

一个时期包括整个训练数据的整个周期。这通常是很多步骤。例如,如果您有2,000张图像,并且批处理大小为10,则一个时代包括2,000张图像/(10张图像/步)= 200步。

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


我对200个步骤的计算进行了修改,但忘记了登录,因此,如果您想与“未知用户”对话...我在这里
Chris Chiasson

16

当我目前正在尝试使用tf.estimator API时,我也想在此添加露水发现。我还不知道在整个TensorFlow中step和epochs参数的用法是否一致,因此目前我只是与tf.estimator(特别是tf.estimator.LinearRegressor)相关。

定义的培训步骤num_epochssteps未明确定义

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了训练输入,并且doc项numpy_input_fn告诉我“ num_epochs:整数,用于遍历数据的时期数。如果None将永远运行,则结束。” 。与num_epochs=1在上面的例子中的训练运行恰好x_train.size /的batch_size次/步骤(在我的情况下,这是175000个步骤x_train的尺寸为700000和batch_size是4)。

定义的培训步骤num_epochssteps显式定义的数量高于隐式定义的步骤数量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,000batch_size = 4),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)

注释:尽管我已设定num_epochs=1呼叫时numpy_input_fn训练在1000步后停止。这是因为steps=1000in estimator.train(input_fn=train_input, steps=1000)覆盖num_epochs=1in tf.estimator.inputs.numpy_input_fn({'x':x_train},y_train,batch_size=4,num_epochs=1,shuffle=True)

结论:无论参数num_epochstf.estimator.inputs.numpy_input_fnsteps用于estimator.train限定,下限确定的,这将通过运行步骤的数目。


11

用简单的话来说,
时代:时代被认为是整个数据集的一次通过的数量
步骤:在张量流中,一步被认为是时代的数量乘以实例除以批大小

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

乌玛(Umar),使用您的公式可获得更好的结果,但只是想知道为什么每个人都有不同的公式?就像上面的其他所有人所说,步数=(图像总数)/批量大小。
Satyendra Sahani '19

@SatyendraSahani我从Coursera提供的GCP课程的一位讲师那里得到了这个公式,可能是这种情况,您可以获得更好的结果。
穆罕默德·乌马尔·阿马纳特

@Umar,但有时样本数量巨大。像我们的情况一样,我们有99,000个样本。如果我们选择批次大小8和纪元20,则总step_size的数量为(20 * 99000)/ 8 = 247,500。这确实是一个很高的数字。我开始怀疑这种方法。
Satyendra Sahani,

8

纪元:一个训练纪元代表了所有训练数据的完整使用,用于梯度计算和优化(训练模型)。

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

每个时期的培训步骤数:total_number_of_training_examples/ batch_size

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


2

由于尚无公认的答案:默认情况下,一个时期运行在您所有的训练数据上。在这种情况下,您有n个步骤,其中n = Training_lenght / batch_size。

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

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

至于设置1个周期的1000个步长还是10个周期的100个步长更好,我不知道是否有一个直接的答案。但是以下是使用TensorFlow时间序列数据教程使用两种方法训练CNN的结果:

在这种情况下,两种方法都可以得出非常相似的预测,只有训练过程不同。

步数= 20 /时代= 100 在此处输入图片说明

在此处输入图片说明

步数= 200 /时代= 10

在此处输入图片说明

在此处输入图片说明

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.