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

时间:2020-07-15 08:09:13

标签: python keras loss

我正在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似乎无济于事)

损失:“类别加权分类交叉熵”,计算方法如下

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,到那时为止,损耗曲线看起来非常好,但是移位2时期2似乎很奇怪。

1 个答案:

答案 0 :(得分:0)

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

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