【问题标题】:Can I use multiple "actual" and "predicted" outputs in a single loss functions?我可以在单个损失函数中使用多个“实际”和“预测”输出吗?
【发布时间】:2020-11-10 05:57:43
【问题描述】:

我在 tensorflow 2.0 中使用多输出模型

input_layer = layers.Input(shape=(INP_MAX_LENGTH), name="input")
embed_layer = layers.Embedding(EMBED_INP_DIM, embedding_size, name="embeddings", weights=[embedding_matrix],  trainable=False, input_length=INP_MAX_LENGTH)(input_layer)
  
lstm_layer1 = layers.LSTM(1024, name="lstm1")(embed_layer)
lstm_layer2 = layers.LSTM(1024, name="lstm2")(embed_layer)
  
output_layer1 = layers.Dense(1, name="output1", activation='relu')(lstm_layer1)
output_layer2 = layers.Dense(1, name="output2", activation='relu')(lstm_layer2)

concat_layer = layers.Concatenate()([output_layer1, output_layer2])

output_layer3 = layers.Dense(1, name="output3", activation='relu')(concat_layer)

model = Model(input=input_layer, output=[output_layer1, output_layer2, output_layer3])

model.compile((optimizer='adagrad', loss={'output1': loss1, 'output2': loss1, 'output3':loss2})

我正在使用分位数损失函数作为我的 loss1,它工作正常。

我希望我的 loss2 函数表现得像这样

import tensorflow.keras.backend as K

def loss2(y_true, y_pred):
   # y_true1 = y from output1
   # y_true2 = y from output2
   # y_pred1 = y from output_layer1
   # y_pred2 = y from output_layer2
   # loss = K.mean(y_true - (K.sqrt(K.square(y_true2 - y_pred2) + K.square(y_true1 - y_pred1)))), axis=-1)
   return loss

简而言之,我正在尝试将距离公式作为我的损失函数,并将两点之间的距离最小化为 0。

我可以将 y_true 和 y_pred 从 output1 和 output2 传递给 loss2 函数吗?我尝试使用 Concatenate 至少通过 y_preds 但不知何故它不起作用。

【问题讨论】:

    标签: python keras tensorflow2.0 loss-function


    【解决方案1】:

    是的,当您有多个输出节点时,您可以拥有接受多个预测的损失函数。

    基本思想是始终将您的输出视为一个向量,因此当您从生成器函数传递它时,它应该是一个列表,而当它传递给损失函数时,它应该仍然是一个列表。

    最好不要为每个输出节点使用不同的损失函数,而是应该为所有输出组合使用一个损失函数。

    【讨论】:

      猜你喜欢
      • 2020-11-01
      • 1970-01-01
      • 2016-03-13
      • 2021-02-19
      • 2021-02-20
      • 1970-01-01
      • 2021-09-28
      • 2021-08-20
      • 1970-01-01
      相关资源
      最近更新 更多