Tensorflow LogCosh自定义损失函数返回nan

Tensorflow LogCosh自定义损失函数返回nan,tensorflow,keras,tensorflow2.0,loss-function,Tensorflow,Keras,Tensorflow2.0,Loss Function,我正在尝试将LogCosh函数实现为一个自定义的loss函数。当我这样做时,我得到一个错误,因为拟合阶段得到NaN作为损失。更奇怪的是,当我运行一组时,它开始给出损失的实际值,然后到达一个点,它开始再次返回NaN 我的模型: import tensorflow as tf from tensorflow import keras from tensorflow.keras import layers model = tf.keras.Sequential([ tf.keras.laye

我正在尝试将LogCosh函数实现为一个自定义的loss函数。当我这样做时,我得到一个错误,因为拟合阶段得到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

为什么它是垃圾/如何修复此问题以使丢失真正起作用?

您不需要为此编写任何自定义函数。已在
TF 2.4
中提供内置损耗功能

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

这不是重点,我很清楚这个事实。。。“我正试图将LogCosh函数实现为一个自定义丢失函数”的哪一部分不清楚?我使用这个内置函数作为参考,以检查我是否正确地使用了自定义丢失函数。如果你知道如何实现这一自定义功能,请让我知道。