TensorFlow中的步骤和时期有什么区别?

时间:2016-07-12 23:20:23

标签: machine-learning tensorflow

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

使用1个纪元运行1000个步骤和使用10个纪元运行100个步骤有什么区别?哪一个在实践中更好?连续时期之间的任何逻辑变化?数据改组?

7 个答案:

答案 0 :(得分:67)

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

人们经常在时代之间的数据集中徘徊。我更喜欢使用random.sample函数来选择要在我的纪元中处理的数据。所以说我想做1000步,批量大小为32.我将从训练数据库中随机选取32,000个样本。

答案 1 :(得分:49)

训练步骤是一次渐变更新。在一步中,batch_size会处理许多示例。

一个纪元由一个完整的循环通过训练数据组成。这通常是很多步骤。例如,如果您有2,000张图像并且批量大小为10,则一个纪元包含2,000张图像/(10幅图像/步长)= 200步。

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

答案 2 :(得分:10)

由于我目前正在尝试使用tf.estimator API,因此我也想在此添加露水发现。我还不知道在整个TensorFlow中步骤和纪元参数的用法是否一致,因此目前我仅与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,并且numpy_input_fn的文档条目告诉我“ num_epochs:整数,用于遍历数据的时期数。如果{{1} }将永远运行。” 。在上述示例中,使用None时,训练的运行时间为 x_train.size / batch_size 次/步(在我的情况下,这是175000步,因为num_epochs=1的大小为700000,而{ {1}}是4)。

x_train定义的训练步骤:batch_size明确定义的数量高于num_epochs隐式定义的步骤数量

steps

评论:num_epochs=1在我的情况下意味着175000步( x_train.size / batch_size ,其中 x_train.size = 700,000 batch_size = 4 ),尽管步数参数设置为200,000 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

estimator.train定义的培训步骤

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) ,但是训练却在1000步之后停止。这是因为num_epochs=1中的numpy_input_fn覆盖了steps=1000中的estimator.train(input_fn=train_input, steps=1000)

结论: 无论num_epochs=1的参数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定义了什么,下限都会确定要执行的步骤数。

答案 3 :(得分:3)

简单地说
Epoch:纪元被视为整个数据集中的一次通过次数
步骤:在张量流中,一个步骤被认为是时期数乘以示例数再除以批处理大小

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

答案 4 :(得分: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 enter image description here

enter image description here

步数= 200 /时代= 10

enter image description here

enter image description here

答案 5 :(得分:1)

根据Google's Machine Learning Glossary,一个时期被定义为

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

如果您使用批量大小 6 训练 10 个时期的模型,则给定总共 12 个样本,这意味着:

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

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

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

答案 6 :(得分:0)

Epoch:一个训练时期代表了所有训练数据在梯度计算和优化(训练模型)中的完整使用。

步骤:训练步骤是指一次使用一批训练数据进行训练。

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

训练步骤总数:纪元数x每个纪元的训练步骤数

为什么人们有时只指定训练步骤数而不指定训练时期数:人们想从训练数据中反复随机抽取“批量大小”数据进行训练,而不是依次遍历所有训练数据。因此,人们只需设置培训步骤的数量即可。