Keras多输出:自定义丢失功能

问题描述 投票:13回答:2

我在keras中使用多输出模型

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

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

我的custom_loss_function是;

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

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

当使用多个输出时,损失函数中y_predy_true参数的形状/结构是什么?我可以按上述方式访问它们吗?是y_pred[0]还是y_pred[:,0]

model keras prediction loss multipleoutputs
2个回答
14
投票

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

基于Keras functional API guide你可以实现这一目标

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 ) ] )

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


0
投票

Sharapolas的回答是对的。

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

我所知道的方法在实践中使用的是从不调用model.compile而只调用model._make_predict_function()。从那以后,您可以通过在那里调用model.output继续构建自定义优化器方法。这将为您提供所有输出,[y2,y3]。在使用它时,使用你的model.trainable_weights和你的损失来获取keras.optimizer并使用它的get_update方法。最后,返回一个keras.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中似乎没有用。因此,如果有人知道方法,请告诉我。我来这里寻找一个:)

© www.soinside.com 2019 - 2024. All rights reserved.