3.2 损失函数及自定义损失函数
tf.keras.losses.BinaryCrossentropy(
from_logits=False, label_smoothing=0, reduction=losses_utils.ReductionV2.AUTO,
name='binary_crossentropy'
)参数from_logits的作用:模型的输出结果没有通过激活函数时,则需要使得from_logits=True;反之,如果模型的输出结果通过激活函数后,则需要使得from_logits=False。
原理是什么呢?当你打开tensorflow的源码时,一切都明白了!
if not from_logits:这个判断语句后,则会直接阶段bce (binary_crossentropy);反之,则会计算nn.sigmoid_cross_entropy_with_logits。
def binary_crossentropy(target, output, from_logits=False):
"""Binary crossentropy between an output tensor and a target tensor.
Arguments:
target: A tensor with the same shape as `output`.
output: A tensor.
from_logits: Whether `output` is expected to be a logits tensor.
By default, we consider that `output`
encodes a probability distribution.
Returns:
A tensor.
"""
if not from_logits:
if (isinstance(output, (ops.EagerTensor, variables_module.Variable)) or
output.op.type != 'Sigmoid'):
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
else:
# When sigmoid activation function is used for output operation, we
# use logits from the sigmoid function directly to compute loss in order
# to prevent collapsing zero when training.
assert len(output.op.inputs) == 1
output = output.op.inputs[0]
return nn.sigmoid_cross_entropy_with_logits(labels=target, logits=output)下面我们再分析下nn.sigmoid_cross_entropy_with_logits:
推导过程如下所示:
最后更新于
这有帮助吗?