我有一个3372149行的数据集,我按照下面的代码每3751行批量处理它们:
train_input_fn = tf.estimator.inputs.numpy_input_fn(
x={"x": train_features_numpy},
y=train_labels_numpy,
batch_size = 3751,
num_epochs= 1,
shuffle=False)
# Train
nn.train(input_fn=train_input_fn)#, steps=10000)
如果我将num_epochs = 1设置为代码中的内容,则意味着培训过程会一次性通过数据集吗?这导致总步数等于3372149/3751 = 899。
如果我取消注释" steps = 10000"部分,并设置" num_epochs = none",训练部分将被迫一直训练到步骤10000.
我有两个问题:
我确实在其他帖子中询问过培训期间没有减少的损失,我现在正在考虑是否有太少的数据集可以进行培训,因此所有过多的步骤都没用。
答案 0 :(得分:2)
多次迭代数据集非常常见且正常。模型的每个“步骤”(即每个批次)都需要一个渐变更新步骤。从直观的角度来说,它朝着该迷你批次所指示的方向迈出了一步。通过一次看到它,它不会学习关于特定样本的所有内容,它只需更接近目标,以及学习速度(以及其他更复杂的因素)决定了多大的步骤。如果你将学习率降低一半,你需要两倍的步数才能到达那里。注意这与epochs无关,只是“更新步骤”(也就是批量)。
了解何时停止的典型方法是在训练模型时绘制测试数据的准确性。您的模型肯定可能会在某个时刻开始过度拟合。如果确实如此,测试精度将开始变差,这是一个明显的最佳停止点。
另请注意,批量数据不是连续的,每个批次都是通过置换数据随机选择的。下一次通过数据集将最终得到不同批次的数据,因此这些批次中的每一个都将产生不同的梯度更新。因此,即使两次通过数据集也不会在每个时期产生相同的更新集。
我实际上并不知道问题#1的答案,因为我没有多大地使用估算器API,但我90%确定它只是置换样本并在每个纪元后再次遍历它们。这是最常见的方法。