LogCosh 自定义损失函数返回 nan

Posted

技术标签:

【中文标题】LogCosh 自定义损失函数返回 nan【英文标题】:LogCosh Custom loss function returning nan 【发布时间】:2021-07-21 07:14:25 【问题描述】:

我正在尝试将 LogCosh 函数实现为自定义损失函数。执行此操作时出现错误,因为拟合阶段将 NaN 作为损失。更奇怪的是,当我大量运行它时,它开始给出损失的实际值,然后达到再次开始返回 NaN 的点。

我的模特:

import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import layers

model = tf.keras.Sequential([
    tf.keras.layers.Flatten(input_shape=(81,)),
    tf.keras.layers.Dense(300, activation='relu'),
    tf.keras.layers.Dense(1)
])

我的损失函数和数据拟合:

def custom_loss(y_true, y_pred):
    x = y_true-y_pred
    return tf.math.log(tf.math.cosh(x))

model.compile(optimizer='adam',
              loss=custom_loss,
              metrics=['MeanAbsoluteError'])

model.fit(train_features, train_labels, epochs=3)

这给了NaN

Train on 21263 samples
Epoch 1/3
21263/21263 [==============================] - 1s 65us/sample - loss: nan - MeanAbsoluteError: nan
Epoch 2/3
21263/21263 [==============================] - 1s 51us/sample - loss: nan - MeanAbsoluteError: nan
Epoch 3/3
21263/21263 [==============================] - 1s 57us/sample - loss: nan - MeanAbsoluteError: nan

为什么它是垃圾/我该如何解决这个问题,让损失真正起作用?

【问题讨论】:

【参考方案1】:

您不需要为此编写任何自定义函数。 LogCosh 已经是 TF 2.4 中提供的内置损失函数。

model.compile(optimizer='adam',
              loss=tf.keras.losses.LogCosh(),
              metrics=['MeanAbsoluteError'])

【讨论】:

这不是重点,我很清楚这个事实......“我正在尝试将 LogCosh 函数实现为自定义损失函数”的哪一部分不清楚?我使用这个内置函数作为参考来检查我是否正确地执行了自定义损失函数。如果您知道如何将其作为自定义函数实现,请告诉我。

以上是关于LogCosh 自定义损失函数返回 nan的主要内容,如果未能解决你的问题,请参考以下文章

Keras 中的自定义损失函数应该返回批次的单个损失值还是训练批次中每个样本的一系列损失?

自定义损失函数返回 - InvalidArgumentError:第二个输入必须是标量,但它具有形状 [64]

在 keras 中制作自定义损失函数

如何在 tf.keras 自定义损失函数中触发 python 函数?

在 TensorFlow 中使用 SSIM 损失返回 NaN 值

Keras 中的自定义损失函数(IoU 损失函数)和梯度误差?