29

我在 Keras 中使用多输出模型

model1 = Model(input=x, output=[y2, y3])

model1.compile((optimizer='sgd', loss=cutom_loss_function)

我的custom_loss功能是

def custom_loss(y_true, y_pred):
   y2_pred = y_pred[0]
   y2_true = y_true[0]

   loss = K.mean(K.square(y2_true - y2_pred), axis=-1)
   return loss

我只想在 output 上训练网络y2

当使用多个输出时,损失函数中的y_pred和参数的形状/结构是什么?y_true我可以像上面那样访问它们吗?是y_pred[0]还是y_pred[:,0]

4

3 回答 3

22

我只想在输出 y2 上训练网络。

基于Keras 功能 API 指南,您可以使用

model1 = Model(input=x, output=[y2,y3])   
model1.compile(optimizer='sgd', loss=custom_loss_function,
                  loss_weights=[1., 0.0])

当使用多个输出时,损失函数中 y_pred 和 y_true 参数的形状/结构是什么?我可以像上面那样访问它们吗?是 y_pred[0] 还是 y_pred[:,0]

在 keras 多输出模型中,损失函数分别应用于每个输出。在伪代码中:

loss = sum( [ loss_function( output_true, output_pred ) for ( output_true, output_pred ) in zip( outputs_data, outputs_model ) ] )

在多个输出上执行损失函数的功能对我来说似乎不可用。人们可能可以通过将损失函数合并为网络的一层来实现这一点。

于 2017-06-09T06:53:03.193 回答
5

如果自定义损失不能应用于您试图忽略的输出,例如如果它们的形状错误,则接受的答案通常不起作用。在这种情况下,您可以为这些输出分配一个虚拟损失函数:

labels = [labels_for_relevant_output, dummy_labels_for_ignored_output]

def dummy_loss(y_true, y_pred):
    return 0.0

model.compile(loss = [custom_loss_function, dummy_loss])
model.fit(x, labels)
于 2021-02-10T21:55:13.183 回答
2

莎拉波拉斯的回答是对的。

但是,有一种比使用层来构建自定义损失函数更好的方法,该损失函数具有模型的多个输出的复杂相互依赖关系。

我知道在实践中使用的方法是从不调用model.compile,而只调用model._make_predict_function(). 从那里开始,您可以继续并通过调用model.output那里来构建自定义优化器方法。这将为您提供所有输出, [y2,y3] 在您的情况下。当你用它做魔法时,keras.optimizer使用你的 model.trainable_weights 和你的损失获取并使用它的 get_update 方法。最后,返回 akeras.function所需的输入列表(仅在您的情况下model.input)以及您刚刚从 optimizer.get_update 调用中获得的更新。此函数现在替换了 model.fit。

以上常用于 PolicyGradient 算法,如 A3C 或 PPO。这是我试图解释的示例: https ://github.com/Hyeokreal/Actor-Critic-Continuous-Keras/blob/master/a2c_continuous.py 查看 build_model 和critic_optimizer 方法并阅读 kreas.backend.function 文档了解会发生什么。

我发现这种方式在会话管理方面经常出现问题,并且目前似乎根本无法在 tf-2.0 keras 中工作。因此,如果有人知道方法,请告诉我。我来这里找一个:)

于 2019-04-28T21:52:47.347 回答