【问题标题】:Combine cross-entropy and mse in loss function在损失函数中结合交叉熵和mse
【发布时间】:2018-03-23 17:12:52
【问题描述】:

我正在研究回归问题。我的数据集的标签范围为[0,1]。出于设计目的,将值超过0.3的标签转换为负数,即0.35转换为-0.35

在keras中,我先尝试了mse作为损失函数,但是性能并不好。在我意识到标签的符号之后,我也尝试了二元交叉熵。但是性能还是不好。

正如我上面解释的,我们似乎可以利用两个损失函数并将它们相加。但我不知道如何编写代码。此外,如果您对这个特定数据集有任何其他建议,请告诉我。

【问题讨论】:

  • 您是否尝试过平均绝对误差(mae)?此外,二元交叉熵适用于分类问题,而不是回归问题。
  • @semicolon 在过去的几天里我尝试了 DNN。我关注的性能指标是符号准确性。当然,预测值也很重要。使用mse和DNN结构,当前符号准确率为81.5%。我用mae 作为损失函数和相同的 DNN 结构尝试了你的建议。符号准确率为 81.7%。下面 Julio 给出的答案几乎是我想要的,尽管出现了错误。其实我想引入交叉熵是为了提高符号的准确性。

标签: python tensorflow keras


【解决方案1】:

您可以创建自己的损失函数,查看keras documentationsource code 的想法,但应该是这样的:

from keras.losses import mean_squared_error, binary_crossentropy

def my_custom_loss(y_true, y_pred):
    mse = mean_squared_error(y_true, y_pred)
    crossentropy = binary_crossentropy(y_true, y_pred)
    return mse + crossentropy

...

model.compile(loss=my_custom_loss, ...)

如果您需要基本张量操作,还可以查看 backend API 以使用原语

【讨论】:

  • 出现错误:TypeError: custom_loss() takes exactly 2 arguments (3 given)。我将模型编译为model.compile(optimizer='adam', loss=self.custom_loss, metrics=['mse'])
  • self 是第三个参数,这就是为什么给你一个错误
【解决方案2】:

您可能希望使用 Keras 函数式 api 来构建多输出模型。

您可以为模型的分类部分创建一个输出,为模型的回归部分创建一个输出。 (仅供参考,在文献中这些被称为 CNN 的分类头和回归头。)

然后您可以为每个输出指定损失函数。

您还可以对每个损失函数进行加权(即为每个模型输出的损失的线性组合设置权重)。

这种类型的多输出模型在Keras functional api guide 中进行了说明。通读链接并注意多输入多输出模型

部分

【讨论】:

    猜你喜欢
    • 2017-03-14
    • 2021-05-17
    • 2021-08-25
    • 2021-07-23
    • 2018-09-03
    • 2016-08-01
    • 2020-03-14
    • 2020-06-15
    • 1970-01-01
    相关资源
    最近更新 更多