首页 > 解决方案 > 为什么 Keras 损失在第一个 epoch 之后急剧下降?

问题描述

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

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 似乎没有帮助)

损失:'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

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

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

标签: pythonkerasloss

解决方案


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

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


推荐阅读