python - 在 Keras 中制定特定的自定义损失函数
问题描述
我正在尝试根据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 中的搜索的标准流程。我应该如何从这里开始以获得分母的最大值,最后是组合损失?我认为我没有正确编写代码来反映方程式。
此外,上述公式是否对每批中的每个样本进行计算?
解决方案
您会收到此错误,因为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)
可能没有必要强制转换您的输入。请注意,我不是平展输入,而是计算平均损失(通常的做法是计算平均值以汇总所有单独的损失)。
注意:未经测试。
推荐阅读
- javascript - 找不到用 Google App Script 替换列中单元格中部分文本的方法
- node.js - 错误:发送后无法设置标头 SSR React + Node
- ios - 我们可以在不重新加载的情况下调整 UITableViewCell 的大小吗?
- java - 将 minifyEnable 应用为 true 以进行签名发布后出错
- xcode - 在 MacOS 上使用 lldb/gdb 调试特使
- angularjs - 尝试用业力和茉莉花进行测试时,“角矩无法找到矩”-AngularJS
- amp-html - non-secure (http) ampHtml links on a secure (https) page?
- java - setVisibility 使用 Integer 查看
- java - 线程安全循环FIFOBlockingQueue
- wordpress - 仅将 woocommerce 优惠券应用于购物车总数,而不应用于税线