首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在Keras (Tensorflow后端)中使用binary_crossentropy损耗

在Keras (Tensorflow后端)中使用binary_crossentropy损耗
EN

Stack Overflow用户
提问于 2017-08-17 17:47:29
回答 3查看 14.2K关注 0票数 8

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

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

使用binary_crossentropy,并在网络的最后一层中添加sigmoid激活,但是否有必要在最后一层中添加sigmoid?正如我在源代码中所发现的:

代码语言:javascript
运行
复制
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)

logits

因此,我不认为最后添加sigmoid是有意义的,但似乎所有的二进制/多标签分类示例和教程--我在Keras网上找到的--最终都添加了sigmoid。另外,我不明白

代码语言:javascript
运行
复制
# Note: nn.softmax_cross_entropy_with_logits
# expects logits, Keras expects probabilities.

为什么Keras期望概率?它不使用nn.softmax_cross_entropy_with_logits函数吗?说得通吗?

谢谢。

EN

回答 3

Stack Overflow用户

发布于 2017-12-13 20:18:10

你说得对,事情就是这样的。我相信这是由于历史原因。

Keras是在tensorflow之前创建的,作为theano的包装器。在theano中,需要手工计算sigmoid/softmax,然后应用交叉熵损失函数。Tensorflow在一个融合op中做所有事情,但是带有sigmoid/softmax层的API已经被社区采用了。

如果您想避免不必要的logit <->概率转换,使用binary_crossentropy调用from_logits=True丢失,不要添加乙状结肠层。

票数 3
EN

Stack Overflow用户

发布于 2018-11-21 18:32:20

在范畴交叉熵中:

  • 如果是prediction,它将直接计算cross entropy
  • 如果是logit,它将应用softmax_cross entropy with logit

在二进制交叉熵中:

  • 如果是prediction,它将把它转换回logit,然后应用sigmoied cross entropy with logit
  • 如果是logit,它将直接应用sigmoied cross entropy with logit
票数 2
EN

Stack Overflow用户

发布于 2019-01-11 10:34:42

在Keras中,默认情况下,我们在输出层使用激活sigmoid,然后使用keras binary_crossentropy丢失函数,它独立于后端实现(Theano、Tensorflow或CNTK)。

如果您更深入地研究Tensorflow的纯情况,您会发现tensorflow后端binary_crossentropy函数(您在问题中粘贴的)使用了tf.nn.sigmoid_cross_entropy_with_logits。后一个函数还添加sigmoid激活。为了避免双乙状结肠,tensorflow后端binary_crossentropy在默认情况下(与from_logits=False一起)将计算逆乙状结肠(logit(x)=log(x/1-x)),以使输出从未激活的网络返回到原始状态。

在最后一层中不使用乙状结肠激活函数,然后调用带有参数from_logits=True的tensorflow后端from_logits=True(或直接使用tf.nn.sigmoid_cross_entropy_with_logits),可以避免额外的激活sigmoid和反向sigmoid计算。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45741878

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档