【问题标题】:Keras training only specific outputsKeras 只训练特定的输出
【发布时间】:2017-03-14 11:59:36
【问题描述】:

我正在使用带有 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,因为它用于测试)。谁能告诉我如何实现这一点或向我保证代码实际上是我想要的吗?

【问题讨论】:

    标签: python neural-network keras


    【解决方案1】:

    你必须像这样创建 2 个不同的模型

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

    你编译两个,但只适合第一个。他们将共享这些层,因此模型 2,即使它没有经过训练,也会从模型 1 中学习到权重。但是,如果 out3 中有一个层是可训练的,但不在图的输入与 out1 和 out2 之间的流中,则该层将不会被训练,因此将保持其初始值。

    这有帮助吗? :-)

    【讨论】:

    • 是的,它确实有帮助!非常感谢:)
    • 太棒了 :-) 我很高兴
    • 对不起,还有一件事。它也适用于 model2 = Model(input=input, output=[out3]) 吗?
    • 当然,当您创建模型对象时会发生什么,它正在编译图中从输入节点到输出节点的所有层...如果中间有您在另一个模型中训练的层,它们的权重将被训练。这就是功能 API 和层/模型对象的强大之处 :-)
    • 感谢您的帮助 ;)
    【解决方案2】:

    您可以将其中一个损失设置为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)
    

    【讨论】:

      猜你喜欢
      • 2017-03-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-12
      • 2019-11-25
      • 2020-02-09
      • 2019-06-22
      • 1970-01-01
      相关资源
      最近更新 更多