在大多数模型中,有一个 steps 参数,指示在数据上运行的步骤数。但是我在大多数实际用法中看到,我们还执行拟合函数N epochs 。
使用1个纪元运行1000个步骤和使用10个纪元运行100个步骤有什么区别?哪一个在实践中更好?连续时期之间的任何逻辑变化?数据改组?
答案 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的结果:
在这种情况下,两种方法都可以得出非常相似的预测,只是训练模式不同。
步数= 200 /时代= 10
答案 5 :(得分:1)
根据Google's Machine Learning Glossary,一个时期被定义为
"对整个数据集进行一次完整的训练,这样每个示例都被看过一次。因此,一个时期代表 N/batch_size
次训练迭代,其中 N 是示例的总数。 "
如果您使用批量大小 6 训练 10 个时期的模型,则给定总共 12 个样本,这意味着:
模型将能够在 2 次迭代 (12 / 6 = 2) 中看到整个数据集,即单个时期。
总体而言,该模型将有 2 X 10 = 20 次迭代(每轮迭代次数 X 没有轮次)
每次迭代后都会重新评估损失和模型参数!
答案 6 :(得分:0)
Epoch:一个训练时期代表了所有训练数据在梯度计算和优化(训练模型)中的完整使用。
步骤:训练步骤是指一次使用一批训练数据进行训练。
每个时期的培训步骤数:total_number_of_training_examples / batch_size
训练步骤总数:纪元数x每个纪元的训练步骤数
为什么人们有时只指定训练步骤数而不指定训练时期数:人们想从训练数据中反复随机抽取“批量大小”数据进行训练,而不是依次遍历所有训练数据。因此,人们只需设置培训步骤的数量即可。