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

Tom*_*mos 6 python loss keras

我正在 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
Run Code Online (Sandbox Code Playgroud)

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

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

损失:‘类别加权分类交叉熵’,计算如下

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
Run Code Online (Sandbox Code Playgroud)

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

编辑:是训练的损失图,我没有时间整理它,它的损失是按步骤绘制的,而不是纪元,你可以看到在 250 步后转移到纪元 2,直到该点为止的损失曲线看起来很好,但是第二个纪元的第二个转变似乎很奇怪。

Eri*_*lan 0

这对我来说听起来不错。请记住,损失和准确性之间存在反比关系,因此随着损失的减少,准确性会增加。

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