Keras训练仅特定的输出

8

我正在使用tensorflow中的Kears,我的模型有3个输出,但我只想训练其中的2个。

model = Model(input=input, output=[out1,out2,out3])
model.compile(loss=[loss1, loss2, loss3], optimizer=my_optimizer)

loss1(y_true, y_pred):
    return calculate_loss1(y_true, y_pred)

loss2(y_true, y_pred):
    return calculate_loss2(y_true, y_pred)

loss3(y_true, y_pred):
    return 0.0*K.mean(y_pred)

我尝试使用上面的代码,但不确定它是否做我想要做的事情。我认为它会累加损失,并训练每个输出与该损失,而我不希望训练out3。(我需要out3因为它在测试中使用)。有人可以告诉我如何实现这一点,或者保证代码实际上达到了我想要的效果吗?

2个回答

23

你需要创建两个不同的模型,就像这样

model1 = Model(input=input, output=[out1,out2])
model2 = Model(input=input, output=[out1,out2,out3])

你编译了两个模型,但只调整了第一个模型。这两个模型将共享层,因此,即使model2没有被训练过,它也将拥有从model1学习到的权重。但是如果out3中存在一层是可训练的,但不在图表中输入和out1以及out2之间的流程中,那么该层将无法训练,因此它将保留其初始值。

这有帮助吗?:-)


是的,它有帮助!非常感谢 :) - DalekSupreme
太好了 :-) 我很高兴。 - Nassim Ben
2
当您创建模型对象时,它会编译从输入到输出节点的图中的所有层...如果在其中有在另一个模型中训练的层,则它们的权重将被训练。这就是函数式API和层/模型对象的强大之处 :-) - Nassim Ben
我阅读了这个来源:https://dev59.com/xlkS5IYBdhLWcg3wDyj5。哪一个更合适? - donto
你是个天才。非常感谢你! - krenerd
显示剩余4条评论

1
您可以将其中一个损失设置为None:
model = Model(input=input, output=[out1,out2,out3])
model.compile(loss=[loss1, loss2, None], optimizer=my_optimizer)


loss1(y_true, y_pred):
    return calculate_loss1(y_true, y_pred)


loss2(y_true, y_pred):
    return calculate_loss2(y_true, y_pred)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接