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



我在 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

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

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

我只想在输出 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 ) ] )

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

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

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)

Sharapolas的回答是正确的。

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

我知道在实践中使用的方法是永远不要打电话给model.compile而只叫model._make_predict_function()。从那里开始,您可以通过调用model.output来继续构建自定义优化器方法。这将为您提供所有输出,[y2,y3]。在用它施展魔法时,得到一个keras.optimizer,并使用它get_update方法,使用你的model.trainable_weights和你的损失。最后,返回一个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 中根本不起作用。因此,如果有人知道一种方法,请告诉我。我来这里是为了寻找一个:)

相关内容

  • 没有找到相关文章

最新更新