最近学习了Policy Gradients,里面用到了sparse_softmax_cross_entropy_with_logits,很惊诧这是个what,查询了许多资料,做了一点实验,终于明白,这就是另一个版本的softmax_cross_entropy_with_logits。
没有sparse:
tf.nn.softmax_cross_entropy_with_logits(
labels=None,
logits=None,
name=None
)
第一个参数labels:实际的标签,如果有batch的话,它的大小就是[batch_size,num_classes],单样本的话,大小就是[num_classes]。
第二个参数labels:就是神经网络最后一层的输出,如果有batch的话,它的大小就是[batch_size,num_classes],单样本的话,大小就是[num_classes]。
有sparse:
tf.nn.sparse_softmax_cross_entropy_with_logits(
_sentinel=None,
labels=None,
logits=None,
name=None
)
第一个参数labels,实际的标签,其shape为([batch_size,1]直接是分类后的结果。
第二个参数labels:就是神经网络最后一层的输出,如果有batch的话,它的大小就是[batch_size,num_classes]。
对比代码
本文使用以下代码进行对比:
import numpy as np
import tensorflow as tf
a = [[0.95,0.02,0.01,0.02],
[0.01,0.02,0.95,0.02],
[0.03,0.094,0.01,0.02]]
b = [0,2,1]
c = [[1,0,0,0],
[0,0,1,0],
[0,1,0,0]]
softmax_cross_entropy_with_logits = tf.nn.softmax_cross_entropy_with_logits(
logits = a,labels = c
)
sparse_softmax_cross_entropy_with_logits = tf.nn.sparse_softmax_cross_entropy_with_logits(
logits = a,labels = b
)
with tf.Session() as sess:
print(
sess.run(softmax_cross_entropy_with_logits),sess.run(sparse_softmax_cross_entropy_with_logits)
)
输出结果为:
[0.7792034 0.7792034 1.3313385] [0.7792034 0.7792034 1.3313385]
由此可知,当函数加上sparse相当于默认该矩阵为稀疏矩阵,将其转化为二维形式时,除去所指定的标签列,其他标签列都是0。