【问题标题】:custom loss - keras自定义损失 - keras
【发布时间】:2019-04-18 14:06:26
【问题描述】:

以下两个模型/编译的行为不同:

def custom_loss(y_true, y_pred):
  return keras.losses.binary_crossentropy(y_true, y_pred)

optimizer = Adam(lr=5e-3)
model.compile(loss=custom_loss, optimizer=optimizer, metrics=['accuracy'])

还有:

optimizer = Adam(lr=5e-3)
model.compile(loss=keras.losses.binary_crossentropy, optimizer=optimizer, metrics=['accuracy'])

可能是什么原因?

【问题讨论】:

  • 你能解释一下“不同”是什么意思吗?
  • 当我观察训练时,我看到不同的损失数字(和准确度)。真正不同的是,自定义损失不起作用,而出厂损失则有效。
  • 我无法重现该问题。两者都产生完全相同的输出。我在 Ubuntu 16.04 和 Python 3 上使用了 Keras 2.2.4.1MxNet 1.5.0(CPU 版本)后端。您使用什么工具,您观察到什么不同?
  • 我使用的是带有 Python 3 和 Jupyter 笔记本的 mac。我的目标是多标签(117 个二进制文件)。
  • @Oren 您是否以同样的洗牌方式使用您的数据。另外,您是否在为网络播种以使随机初始化完全相同?在神经网络中可能有很多不同的东西会导致随机性。

标签: keras loss


【解决方案1】:

如果您实施自定义二元交叉熵损失,您还应该指定正确的准确度指标。这是因为如果您使用 Keras 的二元交叉熵,那么 Keras 会自动调整要使用的准确度指标(在二元准确度和分类准确度之间)。

如果您使用自定义损失,则不会发生这种情况,然后 Keras 将默认为分类准确度,这实际上是错误的,会产生不正确的准确度值。例如:

model.compile(loss=custom_loss, optimizer=optimizer, metrics=['binary_accuracy'])

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-12-19
    • 2017-12-18
    • 2020-03-27
    • 2020-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-25
    相关资源
    最近更新 更多