我正在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似乎很奇怪。
答案 0 :(得分:0)
对我来说听起来不错。请记住,损失与准确性之间存在反比关系,因此随着损失的减少,准确性也会提高。
我的理解是,在第一个时期,您基本上拥有一个具有或多或少随机初始状态的神经网络。在第一个时期之后,通常会通过使损失函数最小化来调整神经网络的权重(如先前所述,损失函数实际上与使准确性最大化相同)。因此,在第二个时期开始时,您的损失应该要好得多(即更低)。这意味着您的神经网络正在学习。