选择每个时期的步数

n.s*_*.st 6 machine-learning keras tensorflow

如果我想用train_generator训练模型,选择之间有明显的区别

  • 10个时期,每个500个步骤

  • 100个纪元,每个50个步骤

目前,我正在训练10个纪元,因为每个纪元都需要很长时间,但是任何显示改进的图形看起来都非常“跳跃”,因为我只有10个数据点。我想如果我使用100个纪元,我可以获得一个更平滑的图形,但是我想首先知道这个图形是否有不利之处

Chr*_*arr 11

根据您所说的,这听起来好像您需要一个更大的batch_size,当然,这可能会影响steps_per_epoch和时期数。

解决跳车

  • 较大的批次大小将为您提供更好的渐变,并有助于防止跳动
  • 您可能还需要考虑较小的学习速率,或学习速率调度程序(或衰减),以使网络在训练时能够“适应”

批量较大的含义

  • batch_size太大会产生内存问题,尤其是在使用GPU的情况下。超出限制后,请拨回直到它可以使用。这将帮助您找到系统可以使用的最大批处理大小。
  • 批次大小太大会使您陷入局部最小值,因此,如果您的培训遇到问题,我会减少一些。想象一下,这里您过度校正了跳动,而跳动的程度不足以进一步最小化损失函数。

何时减少时代

  • 如果您的训练误差非常低,但是您的测试/验证却非常高,那么您可能会因模型过多而过度拟合。
  • 找到正确平衡的最佳方法是对验证测试集使用早期停止功能。您可以在此处指定何时停止训练,并保存权重最大的网络,以减少最佳验证损失。(我强烈建议始终使用此功能)

何时调整每个时期

  • 传统上,每个纪元的步长计算为train_length // batch_size,因为这将使用所有数据点,一次只需要一个批处理大小。
  • 如果您要扩充数据,则可以将其扩展一点(有时我将上述函数乘以2或3等。但是,如果它已经训练了太长时间,那么我只会坚持使用传统方法。

  • 啊,我至少在一开始就增强了直播。然而,这可能会在训练中造成瓶颈,因此增加和保存也可以加快训练速度。 (2认同)

Ioa*_*ios 6

每个纪元的步数与纪元无关。

当然,如果你的生成器在 1 epoch 中一次性通过所有训练数据,那么你会想要什么。为了实现这一点,您应该为每个时期提供等于批次数的步骤,如下所示:

steps_per_epoch = int( np.ceil(x_train.shape[0] / batch_size) )
Run Code Online (Sandbox Code Playgroud)

从上式可知, 越大batch_size, 越低steps_per_epoch

接下来,您将根据所选验证选择纪元。(选择你认为最好的)


Har*_*a Y 5

steps_per_epoch告诉网络一个纪元中包含多少个批次。

根据定义,epoch当数据集完整地运行过模型一次后,就被认为是完整的。换句话说,这意味着所有的训练样本都已经跑遍了模型。(为了进一步讨论,我们假设训练示例的大小为“m”)。

同样根据定义,我们知道“批量大小”在 [1, m] 之间。

以下是TensorFlow 页面的内容steps_per_epoch

如果您只想对此数据集中的特定数量的批次运行训练,则可以传递steps_per_epoch参数,该参数指定模型在进入下一个纪元之前应使用此数据集运行多少个训练步骤。

现在假设您的training_sizem = 128和batch_size b = 16,这意味着您的数据被分为8个批次。根据上面的引用,您可以分配的最大值steps_per_epoch是 8,如@Ioannis Nasios 的答案之一中计算的那样。

但是,您不必仅将该值设置为 8(如我们的示例中所示)。您可以选择 1 到 8 之间的任何值。您只需要注意,训练将仅使用此数量的批次进行。

正如@Chris Farr 在这个答案中正确提到的那样,错误值跳跃的原因可能是批次的大小。

tf.data 数据集的训练和评估

如果这样做,数据集不会在每个时期结束时重置,而是我们只是继续绘制下一批。数据集最终会耗尽数据(除非它是无限循环的数据集)。

低值的优点steps_per_epoch是不同的时期使用不同的数据集进行训练(一种正则化)。但是,如果训练规模有限,那么仅使用堆栈的子集将不是我们想要的。这是一个人必须做出的决定。