自定义损失功能失败,内部出现标准损失

问题描述

我在Keras中使用自定义损失功能遇到麻烦。任务看起来相当简单,但是由于意外行为而无法进行。想法是将tf.keras.losses.SparseCategoricalCrossentropy与一些额外功能一起加入。首先,我想确认一下,如果仅在自定义损失函数中使用稀疏分类交叉熵,那将不会改变网络训练。

解决方案是设置

model.compile(loss="sparse_categorical_crossentropy",...)

这没问题。网络学习并显示出培训和验证准确性方面的改进。

但是,当我定义自定义损失

def new_loss(y_true,y_pred):
    ls = tf.keras.losses.SparseCategoricalCrossentropy()
    return ls(y_true,y_pred)

网络无法训练。

训练和验证准确性降低到0.09 ...,没有适当训练的希望。

此外,如果我执行以下操作

model.compile(loss= tf.keras.losses.SparseCategoricalCrossentropy(),...)

网络训练有素。

Tensorflow版本为

tf.__version__ = '1.15.3'

Keras版本是

keras.__version__ = '2.2.4-tf'

解决方法

我用你的损失函数替换了“sparse_categorical_crossentropy”,它在我的例子中工作得很好,你设法让它工作了吗?

model.compile(loss=new_loss,...)