Keras中的自定义损耗函数(焦点损耗)输入大小错误

Keras中的自定义损耗函数(焦点损耗)输入大小错误,keras,neural-network,deep-learning,loss-function,imbalanced-data,Keras,Neural Network,Deep Learning,Loss Function,Imbalanced Data,我使用一个中立的网络做多类分类。有3个不平衡的类,所以我想用焦点损失来处理平衡。因此,我使用自定义损失函数来拟合Keras序列模型。我尝试了在线找到的多个版本的聚焦损失函数代码,但它们返回相同的错误消息,基本上说输入大小是浴缸大小,而预期为1。谁能看看这个问题并告诉我你是否能解决它?我真的很感激 model = build_keras_model(x_train, name='training1') ​ ​ #适合模型(5个时代的列车) 历史=模型拟合(x=x\U序列,y=y\U序列,批

我使用一个中立的网络做多类分类。有3个不平衡的类,所以我想用焦点损失来处理平衡。因此,我使用自定义损失函数来拟合Keras序列模型。我尝试了在线找到的多个版本的聚焦损失函数代码,但它们返回相同的错误消息,基本上说输入大小是浴缸大小,而预期为1。谁能看看这个问题并告诉我你是否能解决它?我真的很感激

model = build_keras_model(x_train, name='training1')

​ <代码>#适合模型(5个时代的列车) 历史=模型拟合(x=x\U序列,y=y\U序列,批量大小=64,历代数=5, 等级重量=等级重量)


Keras损失函数获取一批预测和训练数据,并使用它们生成损失张量。实现这一点的一种方法是简单地定义一个带有两个张量输入的函数,返回一个数字,如下所示

def mse(y_true, y_pred):
    return K.mean(K.square(y_pred - y_true), axis=-1)
然后在编译时将其传递给模型,如下所示

model.compile(optimizer = tf.keras.optimizers.Adam(0.001), loss = mse)

您正面临这样一个问题:您正在利用某个helper类,该类是为您执行某些逻辑而设计的,但不幸的是,它的文档并不十分清楚它到底为您做了什么,因此,您需要自己做什么

在本例中,使用
tf.keras.Loss.Loss
。您所需要做的就是实现
call()
(以及可选的
\uuuu init\uuu
)。不幸的是,该函数根本没有说明它希望
call()
返回什么。但是,由于您需要在
\uuuu init\uuuu()
中指定
缩减量,我们可以假设
调用()
不只是返回一个数字。否则,
减少
将是无用的。换句话说:错误告诉您,
call()
返回单个数字,而预期返回64个数字(您的批处理大小)

因此,与其自己(通过调用
tf.reduce\u mean(reduced\u fl)
)将批次缩减为一个数字,不如让helper类为您这样做,直接返回
reduced\u f1
。目前您使用的
reduction=tf.keras.loss.reduction.AUTO
很可能就是您想要的

def mse(y_true, y_pred):
    return K.mean(K.square(y_pred - y_true), axis=-1)
model.compile(optimizer = tf.keras.optimizers.Adam(0.001), loss = mse)