首页 文章

在Keras中使用binary_crossentropy丢失(Tensorflow后端)

提问于
浏览
2

在Keras文档中的培训示例中,

https://keras.io/getting-started/sequential-model-guide/#training

使用了 binary_crossentropy 并在网络的最后一层添加了 sigmoid 激活,但是是否需要在最后一层添加 sigmoid ?正如我在源代码中找到的那样:

def binary_crossentropy(output, target, from_logits=False):
  """Binary crossentropy between an output tensor and a target tensor.
  Arguments:
      output: A tensor.
      target: A tensor with the same shape as `output`.
      from_logits: Whether `output` is expected to be a logits tensor.
          By default, we consider that `output`
          encodes a probability distribution.
  Returns:
      A tensor.
  """
  # Note: nn.softmax_cross_entropy_with_logits
  # expects logits, Keras expects probabilities.
  if not from_logits:
    # transform back to logits
    epsilon = _to_tensor(_EPSILON, output.dtype.base_dtype)
    output = clip_ops.clip_by_value(output, epsilon, 1 - epsilon)
    output = math_ops.log(output / (1 - output))
  return nn.sigmoid_cross_entropy_with_logits(labels=target, logits=output)

Keras在Tensorflow中调用 sigmoid_cross_entropy_with_logits ,但在 sigmoid_cross_entropy_with_logits 函数中,再次计算 sigmoid(logits) .

https://www.tensorflow.org/versions/master/api_docs/python/tf/nn/sigmoid_cross_entropy_with_logits

所以我认为最后添加 sigmoid 并不合理,但看起来我在网上找到的所有二进制/多标签分类示例和教程最后都添加了 sigmoid . 另外我不明白是什么意思

# Note: nn.softmax_cross_entropy_with_logits
# expects logits, Keras expects probabilities.

为什么Keras期望概率?它不使用 nn.softmax_cross_entropy_with_logits 功能吗?是否有意义?

谢谢 .

2 回答

  • 0

    你是对的,这正是发生的事情 . 我相信这是由于历史原因 .

    Keras是在tensorflow之前创建的,作为theano的包装器 . 在theano中,必须手动计算sigmoid / softmax然后应用交叉熵损失函数 . Tensorflow在一个融合操作中完成所有操作,但是具有sigmoid / softmax层的API已经被社区采用 .

    如果要避免不必要的logit < - >概率转换,请使用 from_logits=True 调用 binary_crossentropy loss并且不要添加sigmoid层 .

  • 0

    在分类交叉熵中:

    • 如果是 prediction ,它将直接计算 cross entropy

    • 如果是 logit 则适用 softmax_cross entropy with logit

    在二进制交叉熵中:

    • 如果是 prediction 它会将其转换回 logit 然后应用 sigmoied cross entropy with logit

    • 如果是 logit ,它将直接应用 sigmoied cross entropy with logit

相关问题