TensorFlow函数教程:tf.nn.sigmoid_cross_entropy_with_logits
2019-02-01 17:18 更新
tf.nn.sigmoid_cross_entropy_with_logits函数
tf.nn.sigmoid_cross_entropy_with_logits(
_sentinel=None,
labels=None,
logits=None,
name=None
)
定义在:tensorflow/python/ops/nn_impl.py。
计算给定logits的sigmoid交叉熵。
测量离散分类任务中的概率误差,其中每个类是独立的而不是互斥的。例如,可以执行多标签分类,其中图片可以同时包含大象和狗。
为简洁起见, x = logits
, z = labels
。logistic损失是:
z * -log(sigmoid(x)) + (1 - z) * -log(1 - sigmoid(x))
= z * -log(1 / (1 + exp(-x))) + (1 - z) * -log(exp(-x) / (1 + exp(-x)))
= z * log(1 + exp(-x)) + (1 - z) * (-log(exp(-x)) + log(1 + exp(-x)))
= z * log(1 + exp(-x)) + (1 - z) * (x + log(1 + exp(-x))
= (1 - z) * x + log(1 + exp(-x))
= x - x * z + log(1 + exp(-x))
对于x <0,为避免exp(-x)中的溢出,我们重新配置上述内容:
x - x * z + log(1 + exp(-x))
= log(exp(x)) - x * z + log(1 + exp(-x))
= - x * z + log(1 + exp(x))
因此,为了确保稳定性并避免溢出,使用以下的等效公式实现:
max(x, 0) - x * z + log(1 + exp(-abs(x)))
logits和labels必须具有相同的类型和shape。
参数:
- _sentinel:用于防止positional参数。内部的,不要使用。
- labels:一个Tensor,与logits具有相同的类型和shape。
- logits:一个Tensor,类型为float32或float64。
- name:操作的名称(可选)。
返回:
与具有分量logistic损失的logits有着相同shape的Tensor。
可能引发的异常:
- ValueError:如果logits和labels没有相同的shape。