在大多数模型中,有一个指示 运行数据的步骤数的 步骤参数。但是我看到在大多数实际应用中,我们也执行拟合函数 N 时代。
用一个纪元跑1000步和用10个纪元跑100步有什么区别?哪一个在实践中更好?在连续的时代之间有什么逻辑变化吗?数据重组?
一个新纪元通常意味着对所有训练数据进行一次迭代。例如,如果您有20,000个图像,批量大小为100,那么这个时代应该包含20,000/100 = 200个步骤。然而,我通常只是设置一个固定数量的步骤,如每个纪元1000步,即使我有一个更大的数据集。在纪元结束时,我检查平均成本,如果它改善了,我保存一个检查点。从一个时代到另一个时代的步骤之间没有区别。我只是把他们当做检查站。
人们经常在不同时代之间对数据集进行处理。我更喜欢使用 Random. sample 函数来选择在我的时代要处理的数据。假设我想做1000个步骤,批量大小为32。我会从训练数据库中随机抽取32000个样本。
一个训练步骤是一个渐变更新,在一个步骤中处理 batch_size示例。
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定义的训练步骤没有明确定义
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=1
numpy_input_fn
None
x_train
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和 批量 _ 大小 = 4) ,这正是步骤 estimator.train的数量,尽管 step 参数被设置为200,000 estimator.train(input_fn=train_input, steps=200000)。
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)
注释: 虽然我在调用 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。
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)
结论 强 > : 无论 tf.estimator.inputs.numpy_input_fn的 num_epochs参数和 estimator.train的 steps参数如何定义,下限决定了将要运行的步骤数。
tf.estimator.inputs.numpy_input_fn
简单地说 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。
total_number_of_training_examples
培训步骤总数: number_of_epochs x Number of training steps per epoch。
number_of_epochs
Number of training steps per epoch
因为还没有公认的答案: 默认情况下,在所有训练数据上运行一个新纪元。在这种情况下,有 n 个步骤,n = Training _ length/batch _ size。
如果你的训练数据太大,你可以决定限制一个时代的步数
当步骤数达到您设置的限制时,该过程将重新开始,开始下一个纪元。 在 TF 中工作时,通常首先将数据转换为一个批处理列表,这些批处理将提供给模型进行培训。在每个步骤中处理一批产品。
至于是为一个纪元设置1000个步骤更好,还是为10个纪元设置100个步骤更好,我不知道是否有一个直接的答案。 但下面是使用 TensorFlow 时间序列数据教程对 CNN 进行两种训练的结果:
在这种情况下,两种方法导致非常相似的预测,只是训练轮廓不同。
步骤 = 20/纪元 = 100
步骤 = 200/纪元 = 10
根据 谷歌机器学习词汇,一个纪元被定义为
“ 对整个数据集进行完整的训练,以便每个示例只被看到一次。因此,一个纪元表示 N/batch_size训练迭代,其中 N 是示例的总数。”
N/batch_size
如果你是 10个纪元和 批号6的训练模型,给定总 12个样本意味着:
该模型将能够在2次迭代(12/6 = 2)中看到整个数据集,即单个时代。
总的来说,模型将有2 × 10 = 20次迭代(每一纪元的迭代 X 无纪元)
损失和模型参数的重新评估将在每次迭代后执行!
将 x_train的长度除以批量大小
steps_per_epoch = x_train.shape[0] // batch_size