【问题标题】:How does Keras deal with log(0) for categorical cross entropy?Keras 如何处理分类交叉熵的 log(0)?
【发布时间】:2017-11-03 19:10:59
【问题描述】:

我有一个在 MNIST 上训练的神经网络,其损失函数为分类交叉熵。

出于理论上的目的,我的输出层是 ReLu。因此很多 它的输出为 0。

现在我偶然发现了以下问题:

为什么我不会得到很多错误,因为肯定会有很多 我的输出中的零,我将记录它。

为了方便,这里是分类交叉熵的公式。

【问题讨论】:

  • 你确定你的输出层使用 ReLu 吗?也许您实际上是在使用通常的 softmax 函数而没有意识到这一点。如果您仍然需要帮助,我建议您发布您的代码。
  • 我找不到确切的代码了,但我可以肯定,我在输出层使用了 ReLU。整件事对我来说仍然是个谜。但显然不是紧急的:)

标签: keras cross-entropy loss-function


【解决方案1】:

https://keras.io/losses/#categorical_crossentropy 中没有记录它,它似乎依赖于后端,但我很确定它们不会生成 log y,而是 log(y+ epsilon) 其中 epsilon 是一个小常数以防止 log (0)。

【讨论】:

    【解决方案2】:

    Keras 使用常量 1e-7 裁剪网络输出,并在执行 here 定义的对数运算之前再次将此常量添加到裁剪后的输出中。

      epsilon_ = _constant_to_tensor(epsilon(), output.dtype.base_dtype)
      output = clip_ops.clip_by_value(output, epsilon_, 1. - epsilon_)
    
      # Compute cross entropy from probabilities.
      bce = target * math_ops.log(output + epsilon())
      bce += (1 - target) * math_ops.log(1 - output + epsilon())
      return -bce
    

    为什么 Keras 会再次将 epsilon 添加到剪裁的输出中,这对我来说是个谜。

    【讨论】:

      猜你喜欢
      • 2018-10-05
      • 1970-01-01
      • 2021-07-17
      • 2019-07-13
      • 2018-11-03
      • 2019-12-18
      • 1970-01-01
      • 2020-01-03
      • 2017-08-19
      相关资源
      最近更新 更多