【问题标题】:Could you explain me the output of keras at each iteration?你能解释一下每次迭代时 keras 的输出吗?
【发布时间】:2019-05-14 11:10:43
【问题描述】:

当我使用 fit_generator 方法使用 keras 训练顺序模型时,我看到了这个输出

Epoch 1/N_epochs

n/N [====================>.......] - ETA xxxx - 损失:yyyy

我注意到损失随着步数的增加而逐渐减少,正如预期的那样。我的问题是,我还注意到,当一个 epoch 结束而另一个 epoch 开始时,损失的值与我在上一个 epoch 结束时看到的完全不同。

为什么会这样?我认为 epoch 和每个 epoch 的步数是任意值,例如,使用 10 epoch 和 1000 步应该与 1000 epoch 和 10 步相同。但是在 Keras 2.0 的一个纪元和下一个纪元之间究竟发生了什么?

免责声明:我知道 epoch 的定义以及应该如何使用批处理生成器来确定步数,但我的数据太多,无法应用此规则。

【问题讨论】:

    标签: python machine-learning keras deep-learning


    【解决方案1】:

    Keras 在 epoch 期间计算的 loss 是在线累计和估计的。所以它包含了模型在不同权重更新后的损失。

    让我们用一个简单的例子来澄清一下:假设模型只是在改进(每次权重更新都会带来更好的准确性和损失),并且每个 epoch 包含 2 次权重更新(每个 min-batch 是训练的一半数据集)。

    在 epoch X,第一个 mini-batch 被处理,结果是损失分数 2.0。 更新权重后,模型运行第二个 mini-batch,损失分数为 1.0(仅适用于 mini-batch)。但是您会看到 2.0 的损失变为 1.5(所有数据集的平均值)。

    现在我们开始 epoch X+1,但它发生在另一个权重更新之后,这导致第一个 mini-batch 损失 0.8,这是向您显示的。等等等等……

    在你的训练过程中也会发生同样的事情,只是很明显,并不是所有的变化都是积极的。

    【讨论】:

      【解决方案2】:

      第一个和第二个 epoch 之间的损失值不同,原因有一个:

      开始一个纪元时的初始化器是随机的。所以第一个纪元和第二个纪元之间没有连续性。

      这可以让您避免陷入局部最小值,然后使用不同的权重值来获得最小损失。

      你可以为每一层调整这个参数。

      你有,0,1,常数,随机正态,随机均匀,lecun,glorot,Xavier & He..

      看看这里的文档:

      https://keras.io/initializers/ :)

      【讨论】:

      • 这是否意味着在每个 epoch 都从头开始训练?如果在每个 epoch 都初始化权重,那么模型的最终权重是什么?这也意味着我应该在每个 epoch 中使用很多步骤,并且 epochs 根本不是任意的截止,正如 keras 文档中所解释的那样。
      【解决方案3】:

      据我所知,keras 函数的输出是一个运行平均损失,并且损失在 epoch 开始时比结束时大得多。损失在每个 epoch 后重置,并形成新的运行平均值。因此,旧的运行平均值比下一个时期的开始损失要高很多(或至少不同)。

      【讨论】:

        猜你喜欢
        • 2017-01-15
        • 2017-08-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多