python - 我如何向模型指定将什么作为自定义损失函数的输入?
问题描述
我在理解/实现模型中的自定义损失函数时遇到问题。
我有一个由 3 个子模型组成的 keras 模型,正如您在模型架构中看到的那样,
现在,我想在我的自定义损失函数中使用model和model_2的输出。我知道在损失函数定义中我可以写:
def custom_mse(y_true, y_pred):
*calculate stuff*
return loss
但是我如何告诉模型将其 2 个输出作为损失函数的输入呢?
也许,我希望如此,它非常微不足道,但我没有在网上找到任何东西,如果你能帮助我,那就太棒了。
提前致谢
上下文: model和model_2是相同的预训练模型,一个二元分类器,它预测 2 个输入(类图像类型)之间的交互。 model_1是一个生成模型,它将编辑其中一个输入。
所以:
complete_model = Model(inputs=[input_1, input_2], outputs=[out_model, out_model2])
opt = *an optimizer*
complete_model.compile(loss=custom_mse,
??????,
optimizer = opt,
metrics=['whatever'])
主要目标是将预测与已编辑输入与未编辑输入的预测进行比较,因此模型将输出 2 个交互,我需要在损失函数中使用它们。
编辑: 谢谢安德烈的解决方案,
但是,现在我无法同时实现 2 个损失函数,即具有 add_loss(func) 和 model.complie(loss='binary_crossentropy', ...) 中的经典 binary_crossentropy 的那个。
我可以添加一个 add_loss 指定 model_2.output 和标签吗?如果是,你知道怎么做吗?
当我尝试运行他们提出的代码时,他们自己工作而不是一起工作
ValueError: Shapes must be equal rank, but are 0 and 4 From merging shape 0 with other shapes. for '{{node AddN}} = AddN[N=2, T=DT_FLOAT](binary_crossentropy/weighted_loss/value, complete_model/generator/tf_op_layer_SquaredDifference_3/SquaredDifference_3)' with input shapes: [], [?,500,400,1].
解决方案
您compile()
只能为标准损失函数签名 (y_true, y_pred) 添加损失。您不能使用它,因为您的签名类似于 (y_true, (y_pred1, y_pred2))。请改用add_loss()
API。见这里:https ://keras.io/api/losses/
推荐阅读
- java - Hibernate 继承的实体创建重复的条目
- python - 提高2个列表python的迭代速度
- electron - Electron osx systemPreferences.askForMediaAccess 应用程序崩溃
- r - r 未正确编码特殊字符
- java - 在应用程序日志文件中记录 Spring Boot Actuator 健康状态
- c# - 判断可能出现的字符串赋值运算符异常
- arrays - 如何在 Google 表格中对多个字符串使用 REGEXREPLACE
- html - 使用 CSS 更改下拉箭头颜色
- c# - 人脸检测网络摄像头显示空白屏幕打开 cv
- python - 如何将 4d numpy 图像数组转换为 3d?