我的模型只有一个输出,但我想组合两个不同的损失函数:
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>]
我是否可以在不创建另一个损失函数的情况下写出最终的损失函数(因为这会限制我在损失函数之外改变α)?
- 如何执行类似
(1-alpha)*mse + alpha*gse
的操作**
- 如何执行类似
更新:
我的两个损失函数都等价于任何内置keras损失函数的函数签名,接受y_true
和y_pred
,并返回损失的Tensor(可以使用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)
5条答案
按热度按时间lyr7nygr1#
为损失指定自定义函数:
或者如果你不想让一个难看的lambda变成一个实际的函数:
如果你的
alpha
不是某个全局常量,你可以有一个“损失函数工厂”:8yoxcaq72#
是的,定义您自己的自定义损耗函数,并在编译时将其传递给
loss
参数:(Not当然你指的是
gse
)。看看普通损失是如何在Keras实现的会很有帮助:https://github.com/keras-team/keras/blob/master/keras/losses.pybvjveswy3#
loss
函数应为一个函数。您为模型提供了一个包含两个函数的列表尝试:
mcdcgff04#
这并不是说这个答案特别解决了最初的问题,我之所以想写这个答案,是因为当尝试使用
keras.models.load_model
加载一个有自定义损耗的keras模型时,会发生同样的错误,而且在任何地方都没有正确的答案。具体来说,按照keras github repository中的VAE示例代码,在使用model.save
保存后加载VAE模型时会发生这个错误。解决方案是使用
vae.save_weights('file.h5')
只保存权重,而不是保存整个模型。但是,在使用vae.load_weights('file.h5')
加载权重之前,您必须再次构建和编译模型。以下是一个示例实现。
现在,
加载模型和预测(如果在不同的脚本中,则需要导入
VAE
类),最后,差异:[ ref ]
凯拉斯
model.save
节省,1.模型权重
1.模型架构
1.模型编制详情(损失函数和指标)
1.模型优化器和正则化器状态
Keras
model.save_weights
仅保存模型权重。Kerasmodel.to_json()
保存模型架构。希望这有助于有人试验变分自动编码器。
66bbxpm55#
将
MAE
和RMSE
合并在一起:同时,如果要在训练后加载此模型并保存到磁盘: