在Keras文档中的训练示例中,使用了binary_crossentropy,并在网络的最后一层添加了sigmoid激活函数。但是,在最后一层添加sigmoid是否有必要?根据我在源代码中的发现:
Keras在Tensorflow中调用sigmoid_cross_entropy_with_logits函数,但在该函数中,又重新计算了sigmoid(logits)。因此,在最后添加sigmoid似乎没有意义,但似乎我在网上找到的所有二元/多标签分类示例和教程都在最后添加了sigmoid。此外,我不理解的是什么意思。请参考链接:https://www.tensorflow.org/versions/master/api_docs/python/tf/nn/sigmoid_cross_entropy_with_logits
为什么Keras期望概率值?它使用nn.softmax_cross_entropy_with_logits函数吗?这有意义吗?
谢谢。
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(logits)。因此,在最后添加sigmoid似乎没有意义,但似乎我在网上找到的所有二元/多标签分类示例和教程都在最后添加了sigmoid。此外,我不理解的是什么意思。请参考链接:https://www.tensorflow.org/versions/master/api_docs/python/tf/nn/sigmoid_cross_entropy_with_logits
# Note: nn.softmax_cross_entropy_with_logits
# expects logits, Keras expects probabilities.
为什么Keras期望概率值?它使用nn.softmax_cross_entropy_with_logits函数吗?这有意义吗?
谢谢。