tf.nn.sparse_softmax_cross_entropy_with_logits
官方链接
函数原型:
tf.nn.sparse_softmax_cross_entropy_with_logits(
_sentinel=None,
labels=None,
logits=None,
name=None
)
参数说明:
- labels:一个长度为batch_size的一维张量,真实的标签索引,每一个元素对应logits中的一行。
- logits:形状为[batch_size,num_classes]的张量,神经网络的输出。
- 作用:计算神经网络的输出于真实标签的交叉熵。
计算过程:
-
第一步:对logits的每一行进行归一化(或概率化)的softmax操作,计算公式如下:X为logits的某一行。
X = [ x 1 , x 2 , . . . , x n ] X=[x_1,x_2,...,x_n] X=[x1,x2,...,xn] S = s o f t m a x ( X ) S=softmax(X) S=softmax(X) S = [ s 1 , s 2 , . . . , s n ] S=[s_1,s_2,...,s_n] S=[s1,s2,...,sn] s i = e x i ∑ j n e x j s_i=\frac{e^{x_i}}{\sum_{j}^n e^{x_j}} si=∑jnexjexi -
第二步:计算第一步正则化后的logits于label的交叉熵:由于label格式为一维的向量,所以首先需要将其转化为one-hot格式的编码格式。再计算交叉熵(公式如下): y ∗ y^* y∗为logits中的一行, y y y为label中某个元素的one-host编码。
y ∗ = [ y 1 ∗ , y 2 ∗ , . . . , y n ∗ ] y^*=[y^*_1,y^*_2,...,y^*_n] y∗=[y1∗,y2∗,...,yn∗] y = [ y 1 , y 2 , . . . , y n ] y=[y_1,y_2,...,y_n] y=[y1,y2,...,yn] H y ∗ ( y ) = − ∑ i y i ∗ l o g ( y i ) H_{y^*}(y)=-\sum_i {y^*_ilog(y_i)} Hy∗(y)=−i∑yi∗log(yi) -
交叉熵:实际上,交叉熵是衡量两个概率分布p,q之间的相似性,两个分布越相似(即越精确)交叉熵就会越小。