python - 为什么 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 好像很奇怪。
解决方案
这听起来对我来说是正确的。请记住,损失和准确率之间存在反比关系,因此损失减少,准确率增加。
我的理解是,在第一个时期,你基本上有一个或多或少随机初始状态的神经网络。在第一个 epoch 之后,神经网络的权重通常会通过最小化损失函数来调整(如前所述,这实际上与最大化准确度相同)。因此,在第二个纪元开始时,您的损失应该会好很多(即更低)。这意味着你的神经网络正在学习。
推荐阅读
- find - 获取 Mercurial 中文件列表中每个文件的最后一次提交
- c# - 即使表单不可见/关闭,如何制作按键事件处理程序?
- python - 如何在 conda 环境中使用 Jupyter 笔记本?
- json - 使用命令行在 json 文件中导入气流变量
- c# - 如何在 C# 中构建结构列表数组(具有预定义的数组大小)
- sql - 在 SQLite 中实现查询缓存
- amazon-web-services - aws ECS,ECS 实例未注册到 ALB 目标组
- android - 应用程序正常运行,但单击注销按钮时崩溃
- java - 为什么 counter 是 double 而不是 long?
- javascript - 提交数据 Express 时附加多个 JSON 条目