Tensorflow - Cross Entropy Loss
Tensorflow 提供的用于分类的 ops 有:
- tf.nn.sigmoid_cross_entropy_with_logits
- tf.nn.softmax
- tf.nn.log_softmax
- tf.nn.softmax_cross_entropy_with_logits
- tf.nn.softmax_cross_entropy_with_logits_v2 - identical to the base version, except it allows gradient propagation into the labels.
- tf.nn.sparse_softmax_cross_entropy_with_logits
- tf.nn.weighted_cross_entropy_with_logits
其中, 交叉熵相关的损失函数有:
- sigmoid_cross_entropy_with_logits
- weighted_cross_entropy_with_logits
- softmax_cross_entropy_with_logits
- softmax_cross_entropy_with_logits_v2
- sparse_softmax_cross_entropy_with_logits
注: logits 表示未归一化处理的概率, 一般是 softmax 的输入, 网络输出层的输出结果.
根据应用场景中,分类目标的独立性与互斥性, 可以选择 sigmoid 或者 softmax 来实现.
1. sigmoid_cross_entropy_with_logits
作用:
计算给定 logits 的交叉熵(也叫 logistic loss).
用于离散分类任务中, 计算概率误差. 其中每个类别标签class间是相互独立, 且不互斥的.
例如, multilabel classification 问题, 每张图片中可能同时包含一头大象和一只狗.
用法:
tf.nn.sigmoid_cross_entropy_with_logits( _sentinel=None, # Used to prevent positional parameters. 内部参数, 不使用. labels=None, # 与 logits 类型和尺寸一样的张量 logits=None, # type float32 or float64 的张量 name=None ) # op 名字, 可选参数.
计算过程:
记 x=logits,z=labels x = l o g i t s , z = l a b e l s , 有:
L=z∗−log(sigmoid(x))+(1−z)∗−log(1−sigmoid(x)) L = z ∗ − l o g ( s i g m o i d ( x ) ) + ( 1 − z ) ∗ − l o g ( 1 − s i g m o i d ( x ) )
L=z∗−log(1/(1+exp(−x)))+(1−z)∗−log(exp(−x)/(1+exp(−x))) L = z ∗ − l o g ( 1 / ( 1 + e x p ( − x ) ) ) + ( 1 − z ) ∗ − l o g ( e x p ( − x ) / ( 1 + e x p ( − x ) ) )
L=z∗log(1+exp(−x))+(1−z)∗(−log(exp(−x))+log(1+exp(−x))) L = z ∗ l o g ( 1 + e x p ( − x ) ) + ( 1 − z ) ∗ ( − l o g ( e x p ( − x ) ) + l o g ( 1 + e x p ( − x ) ) )
L=z∗log(1+ex