Answers:
历元通常意味着对所有训练数据进行一次迭代。例如,如果您有20,000张图像且批处理大小为100,则纪元应包含20,000 / 100 = 200步。但是,即使我拥有更大的数据集,我通常也只设置固定的步骤数(例如每个时期1000)。在该阶段结束时,我检查平均费用,如果费用有所改善,则保存一个检查点。从一个纪元到另一个纪元的步骤之间没有区别。我只是把它们当作检查站。
人们经常在各个时期之间围绕数据集洗牌。我更喜欢使用random.sample函数来选择要在我的时代处理的数据。假设我想以32个批次的大小执行1000个步骤。我将从训练数据池中随机抽取32,000个样本。
训练步骤是一个梯度更新。第一步,处理了很多示例。
一个时期包括整个训练数据的整个周期。这通常是很多步骤。例如,如果您有2,000张图像,并且批处理大小为10,则一个时代包括2,000张图像/(10张图像/步)= 200步。
如果您在每个步骤中随机(且独立)选择我们的训练图像,通常不会将其称为时期。[这是我的答案与上一个答案不同的地方。另请参阅我的评论。]
当我目前正在尝试使用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=1
了训练输入,并且doc项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_size,x_train.size = 700,000和batch_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=1000
in estimator.train(input_fn=train_input, steps=1000)
覆盖num_epochs=1
in tf.estimator.inputs.numpy_input_fn({'x':x_train},y_train,batch_size=4,num_epochs=1,shuffle=True)
。
结论:无论参数num_epochs
对tf.estimator.inputs.numpy_input_fn
和steps
用于estimator.train
限定,下限确定的,这将通过运行步骤的数目。
用简单的话来说,
时代:时代被认为是整个数据集的一次通过的数量
步骤:在张量流中,一步被认为是时代的数量乘以实例除以批大小
steps = (epoch * examples)/batch size
For instance
epoch = 100, examples = 1000 and batch_size = 1000
steps = 100
由于尚无公认的答案:默认情况下,一个时期运行在您所有的训练数据上。在这种情况下,您有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的结果:
在这种情况下,两种方法都可以得出非常相似的预测,只有训练过程不同。
步数= 200 /时代= 10