【问题标题】:NaN from tf.get_collection(tf.GraphKeys.REGULARIZATION_LOSSES))来自 tf.get_collection(tf.GraphKeys.REGULARIZATION_LOSSES)) 的 NaN
【发布时间】:2022-11-30 10:52:46
【问题描述】:

我正在使用 resnet50 作为编码器进行图像分割,并在 tensorflow 中使用带有跳过层的解池层制作解码器

这是模型结构,

对于损失函数,我使用了 dice_coefficient 和 IOU 公式,将两者相加计算总损失。除了总损失外,我还从网络中添加了 REGULARIZATION_LOSSES

total_loss = tf.add_n([dice_coefficient_output+IOU_output]+tf.get_collection(tf.GraphKeys.REGULARIZATION_LOSSES))

训练开始,在第一个epoch,总损失将在0.4左右 但是,在第 2 个 epoch 中,总损失显示为 nan

解码损失值后,tf.get_collection(tf.GraphKeys.REGULARIZATION_LOSSES) 有每个层的值列表,在大多数层中返回 nan

对于这个挑战,我尝试使用不同的归一化,比如缩放图像数据 = 0 到 1,-1 到 1,z-score,但是 nan 出现在第二个时期。

我试图降低学习率,改变l2 regularization 中的权重衰减,但nan 从第二个时期开始保持不变。

最后,我减少了网络中的神经元,开始训练,nan在第2个epoch消失了,但在第4个epoch出现了。

任何改进此模型的建议,如何摆脱 regularization_loss 中的 nan

谢谢

【问题讨论】:

    标签: python python-3.x tensorflow keras conv-neural-network


    【解决方案1】:

    可能的解决方案:

    1. 您的输入数据可能有问题。尝试调用 assert not np.any(np.isnan(x)) 输入数据以确保您没有引入 楠。还要确保所有目标值都有效。最后,制作 确保数据已正确规范化。你可能想要像素 在 [-1, 1] 范围内而不是 [0, 255] 范围内,例如:

      tf.keras.utils.normalize(data)

      上面的其他相关选项通常是梯度 首先成为 NaN。首先要看的两件事是减少学习 率和可能的梯度裁剪。

      或者,您可以先尝试除以某个常数(可能等于 到数据的最大值?)这个想法是让值足够低 它们不会导致很大的梯度。

      1. 标签必须在损失函数的范围内,因此如果使用基于对数的损失函数,所有标签都必须是非负的。

      我看到有很多东西使模型发散。

      学习率太高。如果损失开始增加然后发散到无穷大,您通常可以判断是否属于这种情况。

      我猜你的分类器使用分类交叉熵成本函数。这涉及取预测的对数,随着预测接近零而发散。这就是为什么人们通常会在预测中添加一个小的 epsilon 值来防止这种分歧。我猜 RESNET 可能会这样做或为此使用 tensorflow opp。可能不是问题。

      可能存在其他数值稳定性问题,例如除以零,其中添加 epsilon 可以提供帮助。另一个不太明显的问题是,如果在处理有限精度数字时未适当简化其导数可能发散的平方根。我再次怀疑这是分类器的问题。

      您可能对输入数据有疑问。尝试对输入数据调用 assert not np.any(np.isnan(x)) 以确保您没有引入 nan。还要确保所有目标值都有效。最后,确保数据已正确规范化。您可能希望像素在 [-1, 1] 范围内而不是 [0, 255] 范围内。

      否则请参阅此链接:https://discuss.pytorch.org/t/getting-nan-after-first-iteration-with-custom-loss/25929/7


      了解必须在损失函数域内的标签的域自适应:

      1. https://machinelearningmastery.com/loss-and-loss-functions-for-training-deep-learning-neural-networks/

      2. https://rohitbandaru.github.io/blog/2021/08/09/Domain-Adaptation.html

      3. https://towardsdatascience.com/understanding-domain-adaptation-5baa723ac71f

      4. https://www.v7labs.com/blog/domain-adaptation-guide

      5. https://arxiv.org/pdf/1901.05335.pdf

      6. https://machinelearning.apple.com/research/bridging-the-domain-gap-for-neural-models

    【讨论】:

    • @joeholler,感谢您的来信,我完成了像素范围 [-1,1] 的归一化并降低了学习率,并使用了梯度裁剪,在这里我摆脱了 NaN 值,谢谢您能否解释第二个点,“标签必须在损失函数的范围内”——我没明白
    • 我更新了我的答案。
    猜你喜欢
    • 2013-03-05
    • 1970-01-01
    • 2018-06-22
    • 1970-01-01
    • 1970-01-01
    • 2018-05-04
    • 1970-01-01
    • 2021-10-28
    • 1970-01-01
    相关资源
    最近更新 更多