Python 使用类numpy运算符的Keras自定义损失函数
我正在尝试构建一个自定义损失函数,用于Keras神经网络(Python)。我希望损失函数是均方误差和手工编码的假阴性率的加权和。当模型预测为0且真值大于0时,假阴性率基本上为零。计算似乎很简单,但我对张量或Keras后端没有经验,因此遇到了一些问题 尝试在模型编译中使用此丢失时,当前错误为: TypeError:传递给参数“x”的值的数据类型bool不在允许值列表中:bfloat16、float16、float32、float64、uint8、int8、uint16、int16、int32、int64、complex64、complex128 Python伪代码:Python 使用类numpy运算符的Keras自定义损失函数,python,tensorflow,keras,neural-network,loss-function,Python,Tensorflow,Keras,Neural Network,Loss Function,我正在尝试构建一个自定义损失函数,用于Keras神经网络(Python)。我希望损失函数是均方误差和手工编码的假阴性率的加权和。当模型预测为0且真值大于0时,假阴性率基本上为零。计算似乎很简单,但我对张量或Keras后端没有经验,因此遇到了一些问题 尝试在模型编译中使用此丢失时,当前错误为: TypeError:传递给参数“x”的值的数据类型bool不在允许值列表中:bfloat16、float16、float32、float64、uint8、int8、uint16、int16、int32、in
def my_custom_loss(y_true, y_pred):
w1 = 0.25
w2 = 1-w1
mse = np.mean(np.square(y_pred-y_true))
y_true_pos = y_true > 0
y_pred_zero = y_pred == 0
FN = np.mean(y_true_pos * y_pred_zero)
loss = w1*mse + w2*FN
return loss
尝试Keras实施(目前失败):
如果好奇的话,这种自定义损失的原因是我的数据(0-255)表示罕见的事件量级,并且严重膨胀为零,因此模型通常无法学习预测任何地方的0。这种结合了震级和分类损失的加权损失类似于零膨胀统计模型的传统设置。零膨胀神经网络,其中一个网络预测一个二进制标签,另一个网络预测标签=1时的幅度,还没有很好地建立,直接使用损失函数似乎是更有效的举措。由于考虑到这一罕见事件的现实意义,我更关心的是限制假阴性率,而不是假阳性率,但如果更容易实现的话,我会满足于像F1分数这样的东西
from keras.layers import multiply
from keras.losses import mean_squared_error
from keras import backend as K
def my_custom_loss(y_true, y_pred):
w1 = 0.25
w2 = 1-w1
mse = mean_squared_error(y_true, y_pred) # built in function works fine
y_true_pos = K.greater(y_true, 0)
y_pred_zero = K.equal(y_pred, 0)
FN = K.mean(multiply([y_true_pos, y_pred_zero]))
loss = K.sum(w1*mse, w2*FN)
return loss