python - Keras/Tensorflow:单输出的组合损失函数
问题描述
我的模型只有一个输出,但我想结合两种不同的损失函数:
def get_model():
# create the model here
model = Model(inputs=image, outputs=output)
alpha = 0.2
model.compile(loss=[mse, gse],
loss_weights=[1-alpha, alpha]
, ...)
但它抱怨我需要有两个输出,因为我定义了两个损失:
ValueError: When passing a list as loss, it should have one entry per model outputs.
The model has 1 outputs, but you passed loss=[<function mse at 0x0000024D7E1FB378>, <function gse at 0x0000024D7E1FB510>]
我是否可以在不必创建另一个损失函数的情况下编写最终的损失函数(因为这会限制我在损失函数之外更改 alpha)?
我该怎么做(1-alpha)*mse + alpha*gse
?
更新:
我的两个损失函数都等效于任何内置 keras 损失函数的函数签名,接受y_true
并y_pred
返回张量以用于损失(可以使用 减少为标量K.mean()
),但我相信,这些损失函数的定义方式应该只要它们返回有效损失,就不会影响答案。
def gse(y_true, y_pred):
# some tensor operation on y_pred and y_true
return K.mean(K.square(y_pred - y_true), axis=-1)
解决方案
为损失指定一个自定义函数:
model = Model(inputs=image, outputs=output)
alpha = 0.2
model.compile(
loss=lambda y_true, y_pred: (1 - alpha) * mse(y_true, y_pred) + alpha * gse(y_true, y_pred),
...)
或者,如果您不希望丑陋的 lambda 使其成为实际函数:
def my_loss(y_true, y_pred):
return (1 - alpha) * mse(y_true, y_pred) + alpha * gse(y_true, y_pred)
model = Model(inputs=image, outputs=output)
alpha = 0.2
model.compile(loss=my_loss, ...)
编辑:
如果你alpha
不是一些全局常数,你可以有一个“损失函数工厂”:
def make_my_loss(alpha):
def my_loss(y_true, y_pred):
return (1 - alpha) * mse(y_true, y_pred) + alpha * gse(y_true, y_pred)
return my_loss
model = Model(inputs=image, outputs=output)
alpha = 0.2
my_loss = make_my_loss(alpha)
model.compile(loss=my_loss, ...)
推荐阅读
- webpack - 如何使用“npx webpack-cli init”
- c++ - 是否可以将带有捕获和参数的 lambda 传递给另一个函数?如果是这样,怎么做?
- express - 无法在承诺内调用 res.send()
- typescript - 如何使用 nyc 从函数覆盖范围中排除用 TypeScript 编写的私有构造函数?
- php - 为什么我只在下面的代码中获得数组“row”中的第一行值。我需要与查询对应的所有值
- apache-spark - 由于 bigendian 火花测试失败
- php - 无法在 React Native 中通过 Axios 发布到 PHP 服务器
- javascript - CKEditor 5:无法将多个属性添加到“img”标签
- javascript - 当没有行匹配搜索输入时如何隐藏表格的元素?- Javascript
- c# - Unity 错误 - UnityEditor.EditorApplication.delayCall 未找到