我在 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)的第二个模型,如示例所示。两个模型共享相同的层,因此在训练第一个模型时,两个模型的权重都会更新,如文档(部分:共享层)中所述。有更好的解决方案吗?