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

sha*_*aaa 19 model prediction loss multipleoutputs keras

我在keras中使用多输出模型

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

model1.compile((optimizer='sgd', loss=cutom_loss_function)
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

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

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

Sha*_*las 18

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

基于Keras功能API指南,您可以实现这一目标

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

当使用多个输出时,损失函数中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 ) ] )
Run Code Online (Sandbox Code Playgroud)

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

  • 除非最近框架发生了变化,否则最简单的解决方案是将输出连接成单个损失函数,然后在那里处理它们 (5认同)

小智 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)
Run Code Online (Sandbox Code Playgroud)