[![在此处输入图片描述] [1]] [1]
我正在尝试基于 3个输出变量来制定上述自定义损失函数。本质上,我想通过取y_true或y_pred的最大值来归一化为abs(y_true-y_pred)给出的每个输出的误差,然后对其求和以求出合并损失。
到目前为止我尝试过的事情
def custom_loss(y_true, y_pred):
y_true_f = K.flatten(y_true)
y_pred_f = K.flatten(y_pred)
y_true_fc = K.cast(y_true_f, 'float32')
y_pred_fc = K.cast(y_pred_f, 'float32')
err = K.abs(y_true_fc - y_pred_fc)
loss = K.sum(err)
return loss
我得到一个错误:
TypeError: Value passed to parameter 'reduction_indices' has DataType float32 not in list of allowed values: int32, int64
我不确定我是否需要flatten()或K.cast(),但是根据我在SO中的搜索,这似乎是标准流程。我应该如何从这里着手,以便获得分母的最大值,最后得到合并损失?我认为我编写的代码无法正确反映方程式。
还可以用上述公式对每批中的每个样品进行计算吗?
答案 0 :(得分:1)
您会收到此错误,因为K.max沿单张量计算最大值(第二个参数表示归约轴)。要在两个<张量> 张量>之间找到逐个元素的最大值,可以使用K.maximum代替。以下函数实现您的方程式:
def custom_loss(y_true, y_pred):
y_true_c = K.cast(y_true, 'float32') # Shape=(batch_size, 3)
y_pred_c = K.cast(y_pred, 'float32') # Shape=(batch_size, 3)
# Compute error
num = K.abs(y_true_c - y_pred_c) # Shape=(batch_size, 3)
den = K.maximum(y_true_c, y_pred_c) # Shape=(batch_size, 3)
err = K.sum(num / den, axis=-1) # Shape=(batch_size,)
# Output loss
return K.mean(err)
可能没有必要强制转换您的输入。请注意,我不是在平整输入,而是在计算平均损失(通常的做法是计算均值以汇总所有单个损失)。
注意:未测试。