【问题标题】:Single Loss for Multiple Outputs多路输出的单路损耗
【发布时间】:2020-03-09 04:03:20
【问题描述】:

我想在 Keras/Tensorflow 中创建一个具有多个输出的神经网络。我想创建一个 SINGLE 损失函数,它考虑所有输出并相应地计算损失。我需要这样做,因为输出是相互关联的。我怎样才能做到这一点?我读到了将所有输出连接到单个密集层,然后计算该层的损失。有没有更方便的方法来实现多个输出的单个损失?

我在想这样的事情:

def my_custom_loss(y_true_0, ..., y_true_n, y_pred_0, ..., y_pred_n):
   return something

y_true_0, ..., y_true_ny_pred_0, ..., y_pred_n

应该是 n 个输出(密集)层的真实/预测输出。

【问题讨论】:

    标签: python tensorflow keras loss


    【解决方案1】:

    您可以根据变量的性质实现损失函数。下面给出了一些标准的:

    如果它们只是数字(而不是概率): MSE损失

    def my_custom_loss(y_true_0, ..., y_true_n, y_pred_0, ..., y_true_n):
       y_true = tf.stack([y_true_0,...y_true_n], axis=0)
       y_pred = tf.stack([y_pred_0,...y_pred_n], axis=0)
       something = tf.losses.mean_squared_error(y_true, y_pred)
       return something
    

    OR绝对差异损失

    def my_custom_loss(y_true_0, ..., y_true_n, y_pred_0, ..., y_true_n):
       y_true = tf.stack([y_true_0,...y_true_n], axis=0)
       y_pred = tf.stack([y_pred_0,...y_pred_n], axis=0)
       something = tf.losses.absolute_difference(y_true, y_pred)
       return something
    

    如果它们是一个热向量(有效概率):

    def my_custom_loss(y_true_0, ..., y_true_n, y_pred_0, ..., y_true_n):
       y_true = tf.stack([y_true_0,...y_true_n], axis=0)
       y_pred = tf.stack([y_pred_0,...y_pred_n], axis=0)
       something = tf.reduce_mean(tf.keras.losses.binary_crossentropy(y_true, y_pred))
       return something
    

    如果它们是零和一(不是有效概​​率):

    def my_custom_loss(y_true_0, ..., y_true_n, y_pred_0, ..., y_true_n):
       y_true = tf.stack([y_true_0,...y_true_n], axis=0)
       y_pred = tf.stack([y_pred_0,...y_pred_n], axis=0)
       something = tf.reduce_mean(tf.keras.losses.binary_crossentropy(y_true, y_pred), from_logits=True)
       return something
    

    不仅限于这些。你可以创建自己的损失函数,只要它是可微的。

    【讨论】:

    • 谢谢,但这不是我想要的。问题是如何在单个损失函数中访问多个输出。 --> 我从哪里得到所有的 y_true_0, ..., y_true_n / y_pred_0, ..., y_pred_n
    • 不是“我想创建一个单一的损失函数,它将所有输出都考虑在内并相应地计算损失。”这是什么意思?
    • 也许我应该澄清一下:我有一个多输出网络(>1 个输出层)。有没有办法在单个损失函数中收集所有输出层 logits
    • 好的,现在我很困惑,你需要损失函数还是所有输出?
    • 很抱歉造成混淆。我需要所有输出作为单个函数的输入。通常网络的每个输出层都有自己的损失函数。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多