为啥 Keras 损失在第一个 epoch 之后急剧下降?

Posted

技术标签:

【中文标题】为啥 Keras 损失在第一个 epoch 之后急剧下降?【英文标题】:Why does Keras loss drop dramatically after the first epoch?为什么 Keras 损失在第一个 epoch 之后急剧下降? 【发布时间】:2020-11-04 16:25:11 【问题描述】:

我正在 Keras/Tensorflow 中训练 U-Net CNN,发现损失在第一个 epoch 的最后一批和第二个 epoch 的第一批之间大幅减少:

Epoch 00001: loss improved from inf to 0.07185 - categorical_accuracy: 0.8636
Epoch 2/400: 1/250 [.....................] - loss: 0.0040 - categorical_accuracy: 0.8878

奇怪的分类准确率不会随着损失而下降,而是略有增加。在损失下降之后,它并没有进一步下降,而是在较低的值附近稳定下来。我知道关于问题的信息很少,但这种行为可能表明我可以进一步调查的常见问题?

一些额外的信息: Optimizer = Adam(lr=1e-4)(降低 lr 似乎没有帮助)

Loss: 'class weighted categorical cross entropy',计算如下

def class_weighted_categorical_crossentropy(class_weights):
        
        def loss_function(y_true, y_pred):

        # scale preds so that the class probas of each sample sum to 1
        y_pred /= tf.reduce_sum(y_pred, -1, True)
        # manual computation of crossentropy
        epsilon = tf.convert_to_tensor(K.epsilon(), y_pred.dtype.base_dtype)
        y_pred = tf.clip_by_value(y_pred, epsilon, 1. - epsilon)

        # Multiply each class by its weight:
        classes_list = tf.unstack(y_true * tf.math.log(y_pred), axis=-1)
        for i in range(len(classes_list)):
            classes_list[i] = tf.scalar_mul(class_weights[i], classes_list[i])

        # Return weighted sum:
        return - tf.reduce_sum(tf.stack(classes_list, axis=-1), -1)

    return loss_function

非常感谢任何想法/健全性检查!

编辑:This 是训练的损失图,我没有时间整理它,它的损失是按步绘制的,而不是纪元,你可以看到在 250 步后转移到纪元 2,直到那个点的损失曲线看起来很好,但是 shift 2 epoch 2 看起来很奇怪。

【问题讨论】:

您是否有高度不平衡的类别? 没有错,交叉熵损失考虑了一个类的置信度(概率),以及它是否预测了正确的类。准确率只考虑被预测的正确类别,而不考虑置信度分数,因此损失可以改变而不改变准确率是正常的。 @AnkurAnkan 是的!一类是大约。只有 5% 的样本。 【参考方案1】:

这听起来对我来说是正确的。请记住,损失和准确率之间存在反比关系,因此损失减少,准确率提高。

我的理解是,在第一个时期,你基本上有一个或多或少随机初始状态的神经网络。在第一个 epoch 之后,神经网络的权重通常会通过最小化损失函数来调整(如前所述,这实际上与最大化准确度相同)。因此,在第二个纪元开始时,您的损失应该好很多(即更低)。这意味着您的神经网络正在学习。

【讨论】:

啊,是的,当然,我关于丢失/准确性的错误。但是你不认为损失超过 10 倍的改善有点过分吗?尤其是当损失在剩余的训练中保持不变并且不会进一步减少时。 不幸的是,从你的描述中我看不出损失是多么的持续。考虑到 NN 正在从低熵状态变为高熵状态,我认为 10 倍听起来并不合理。考虑将调试输出示例添加到您的问题描述中,否则无法知道。 对不起,我不知道什么信息会有用!我将在我的问题中添加损失曲线,以便您看到它看起来多么不自然。

以上是关于为啥 Keras 损失在第一个 epoch 之后急剧下降?的主要内容,如果未能解决你的问题,请参考以下文章

为啥在第 35 个 epoch 之后训练和验证的准确率会随着小幅度的下降而上升?

LSTM 模型中 epoch 图中的损失跳跃 - keras

TensorFlow 损失函数在第一个 epoch 后归零

使用 Keras 训练 CNN-LSTM 时卡在第一个 epoch

keras:如何在训练前获得初始损失函数值

使用keras的多个验证集