首页 > 解决方案 > 为什么我的 Keras 自定义损失函数不起作用?

问题描述

我写了一个平方损失函数来对一个热编码数据进行分类

def squared_categorical_loss(y_true, y_pred):
    return K.mean(K.square(1.0 - K.sum(y_true * y_pred, axis=(1)))) 

在给定 numpy 数组示例时有效,例如

y_true = np.asarray([[1,0,0],[0,1,0]])
y_pred = np.asarray([[0.5,0.2,0.3],[0.4,0.6,0]])
squared_categorical_loss(y_true, y_pred)

上面的示例返回一个值为 0.205 的张量,它是 (1-0.5)^2 和 (1-0.6)^2 的平均值,这是期望的结果,并且应该是一个通常与准确性相关的可优化损失函数,但当我将其应用于 TensorFlow 模型时

model.compile(optimizer='adam',
                  loss=squared_categorical_loss,
                  metrics=['accuracy'])

损失减少到极小的值,而训练准确度保持在 50% 以下,这是不可能的,因为如果准确度不超过 50%,就无法在数学上实现低于 0.125 的损失,那么我的实现有什么问题?谢谢!

标签: pythontensorflowkerasneural-networkloss-function

解决方案


只有当 y_pred 被归一化(总和等于 1)时它才会起作用。

我认为您忘记在模型的最后一层应用 softmax。


推荐阅读