使用多输入的 Keras 自定义损失

数据挖掘 喀拉斯
2022-03-11 03:08:24

我在 keras 中有一个带有自定义损失的模型。这种损失是使用实际和预测的标签(或值)计算的,并且还基于一些输入值

(一个例子是根据奖励或优势来定义损失,就像在强化学习环境中的策略梯度方法中一样)

示例代码:
注意:损失计算中使用的输入值命名为“in2”,变量为input_2

input_1=keras.layers.Input(...,name="in1")
output= keras.layers.Dense(...)(input_1)

input_2=keras.layers.Input(...,name="in2")
def loss_func(y_true,y_pred):
    # some custom loss i define based on input_2
    loss = keras.layers.Dense(..)(input_2) 
    return loss

my_model=keras.Model(inputs=[input_1,input_2],outputs=output)
my_model.compile(...,loss=loss_func,)

现在的问题是,当我只想预测一个输出时,我必须为未使用的input_2. 仅用于计算input_2损失,不用于计算模型输出。但是当我使用此代码时,由于不提供“in2”而出现错误:

# this throws error for not providing input value for 'in2'
my_model.predict({'in1':some_value}) 

所以我必须提供一些虚拟值,in2以便模型输出它的值,尽管它不使用in2提供的值。请注意,提供 None 值也不起作用。我认为这个功能是在 keras 内部实现的。

或者我做错了?如果是,合适的方法是什么?

想法:
我想到一个想法,也许我们可以定义两个模型。一个模型用于训练,另一个模型用于预测:

my_model_for_training = keras.Model(inputs=[input_1,input_2],outputs=output)
my_model_for_predicting = keras.Model(inputs=[input_1],outputs=output)

当我想预测时,我只使用不需要 input_2 (或in2)的第二个模型,如示例所示。两个模型共享相同的层,因此在训练第一个模型时,两个模型的权重都会更新,如文档(部分:共享层)中所述。有更好的解决方案吗?

1个回答

当您处于推理阶段时,除非您使用验证集来微调您的模型,否则不会计算任何损失。
使用两个具有共享层的模型很好,但我建议开始训练模型,不要浪费时间编写完美的代码。