我在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_pred
和y_true
参数的形状/结构是什么?
我可以按上述方式访问它们吗?是y_pred[0]
还是y_pred[:,0]
?
答案 0 :(得分: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 ) ] )
对我来说,在多个输出上执行损失功能的功能似乎无法使用。人们可能通过将损失函数作为网络层来实现。
答案 1 :(得分:1)
如果自定义损失不能应用于您试图忽略的输出,则接受的答案通常不起作用,例如如果他们有错误的形状。在这种情况下,您可以为这些输出分配一个虚拟损失函数:
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)
答案 2 :(得分:0)
Sharapolas的答案是正确的。
但是,比使用层来构建具有多个模型输出的相互依赖关系的自定义损失函数更好的方法。
我知道在实践中使用的方法是从不调用model.compile,而仅调用model._make_predict_function()。从那里开始,您可以通过在其中调用model.output来继续构建自定义优化器方法。根据您的情况,这将为您提供所有输出[y2,y3]。用它做魔术时,请使用keras.optimizer并通过您的model.trainable_weights和您的损失使用它的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和批评者优化器方法,并阅读kreas.backend.function文档以了解会发生什么。
我发现这种方法在会话管理中经常遇到问题,并且目前似乎根本无法在tf-2.0 keras中使用。因此,如果有人知道方法,请告诉我。我来这里找一个:)