我的模型只有一个输出,但是我想结合两个不同的损失函数:
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, ...)
关于python - Keras/Tensorflow : Combined Loss function for single output,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51705464/