Model 当有多个输出时,如何仅在一个输出上训练网络?

Model 当有多个输出时,如何仅在一个输出上训练网络?,model,keras,prediction,loss,multipleoutputs,Model,Keras,Prediction,Loss,Multipleoutputs,我在Keras中使用多输出模型 model1 = Model(input=x, output=[y2, y3]) model1.compile((optimizer='sgd', loss=cutom_loss_function) 我的自定义\u丢失功能是 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_

我在Keras中使用多输出模型

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

model1.compile((optimizer='sgd', loss=cutom_loss_function)
我的
自定义\u丢失
功能是

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_pred
y_true
参数的形状/结构是什么? 我可以如上所述访问它们吗?它是
y_pred[0]
还是
y_pred[:,0]

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

基于此,您可以使用

model1 = Model(input=x, output=[y2,y3])   
model1.compile(optimizer='sgd', loss=custom_loss_function,
                  loss_weights=[1., 0.0])
损失中y_pred和y_真参数的形状/结构是什么 使用多个输出时的功能?我可以如上所述访问它们吗? 是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 ) ] )

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

Sharapolas的答案是正确的

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

我知道在实践中使用的方法是从不调用
model.compile
,而只调用
model.\u make\u predict\u function()
。从那以后,您可以通过在那里调用
model.output
来构建自定义优化器方法。这将为您提供案例中的所有输出[y2,y3]。当你用它施展魔法时,使用一个
keras.optimizer
并使用它的get\u更新方法,使用你的model.trainible\u权重和你的损失。最后,返回一个带有所需输入列表的
keras.function
(仅在您的情况下为
model.input
)以及刚从optimizer.get\u update调用中获得的更新。此函数现在取代model.fit

上述内容通常用于策略梯度算法,如A3C或PPO。下面是我试图解释的一个例子: 查看build_model和critic_optimizer方法,并阅读kreas.backend.function文档以了解发生了什么


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

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

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)

在keras多输出模型中,损耗函数分别应用于每个输出。
我有一个类似的问题,我需要两个单独输出的y_真值和y_pred值。如何解决这个问题?除非框架最近发生了变化,否则最简单的解决方案是将输出连接到单个损失函数中,然后处理它们there@Sharapolas您是否有此语句的实际示例
最简单的解决方案是将输出连接到单个损失函数中,然后处理它们有