您的位置:首页 > 运维架构

tf.nn.sparse_softmax_cross_entropy_with_logits()

2017-08-10 11:12 363 查看
参考官方文档

format:sparse_softmax_cross_entropy_with_logits(_sentinel=None, labels=None, logits=None, name=None)

 Args:

      _sentinel: Used to prevent positional parameters. Internal, do not use.(这个参数一般不用)

      labels: `Tensor` of shape `[d_0, d_1, ..., d_{r-1}]` (where `r` is rank of

                   `labels` and result) and dtype `int32` or `int64`. Each entry in `labels`

                    must be an index in `[0, num_classes)`. Other values will raise an

                    exception when this op is run on CPU, and return `NaN` for corresponding

                     loss and gradient rows on GPU.(这个labels参数要注意,它的shape必须是`[d_0, d_1, ..., d_{r-1}]'(而参数logits的shape是[d_0, d_1, ..., d_{r-1},num_classes]`其中差别自行体会) 数据类型必须是int32或者int64,且在labels中的每个值必须是在[0,num_classes),否则在这个操作运行在cpu的时候将会出现exception,运行在GPU的时候将会返回'NaN',而不是返回loss了,这个情况我遇到过,所以在看到输出的不是loss值而是‘NaN’时就应该仔细检查一下这个函数中的labels有没有符合条件)

      logits: Unscaled log probabilities of shape

        `[d_0, d_1, ..., d_{r-1}, num_classes]` and dtype `float32` or `float64`.

        name: A name for the operation (optional).(这里注意shape和数据类型必须是float32和float64,一般很容易搞错,而tf.nn.softmax_cross_entropy_with_logits求 数据类型可以是float16 ,`float32` or `float64`.)

 Returns:

      A `Tensor` of the same shape as `labels` and of the same type as `logits`

      with the softmax cross entropy loss.(返回值要和tensor相同的shape和labels相同的数据类型)

这个函数和tf.nn.softmax_cross_entropy_with_logits函数比较明显的区别在于它的参数labels的不同,这里的参数label是非稀疏表示的,比如表示一个3分类的一个样本的标签,稀疏表示的形式为[0,0,1]这个表示这个样本为第3个分类,而非稀疏表示就表示为2(因为从0开始算,0,1,2,就能表示三类),同理[0,1,0]就表示样本属于第二个分类,而其非稀疏表示为1。tf.nn.sparse_softmax_cross_entropy_with_logits()比tf.nn.softmax_cross_entropy_with_logits多了一步将labels稀疏化的操作。因为深度学习中,图片一般是用非稀疏的标签的,所以用tf.nn.sparse_softmax_cross_entropy_with_logits()的频率比tf.nn.softmax_cross_entropy_with_logits高。

栗子

import tensorflow as tf
#our NN's output
logits=tf.constant([[1.0,2.0,3.0],[1.0,2.0,3.0],[1.0,2.0,3.0]])
#step1:do softmax
y=tf.nn.softmax(logits)
#true label
#注意这里标签必须是浮点数,不然在后面计算tf.multiply时就会因为类型不匹配tf_log的float32数据类型而出错
y_=tf.constant([[0,0,1.0],[0,0,1.0],[0,0,1.0]])#这个是稀疏的标签
#step2:do log
tf_log=tf.log(y)
#step3:do mult
pixel_wise_mult=tf.multiply(y_,tf_log)
#step4:do cross_entropy
cross_entropy = -tf.reduce_sum(pixel_wise_mult)

#do cross_entropy just two step
#将标签稠密化
dense_y=tf.arg_max(y_,1)
cross_entropy2_step1=tf.nn.sparse_softmax_cross_entropy_with_logits(labels=dense_y,logits=logits)
cross_entropy2_step2=tf.reduce_sum(cross_entropy2_step1)#dont forget tf.reduce_sum()!!
with tf.Session() as sess:
y_value,tf_log_value,pixel_wise_mult_value,cross_entropy_value=sess.run([y,tf_log,pixel_wise_mult,cross_entropy])
sparse_cross_entropy2_step1_value,sparse_cross_entropy2_step2_value=sess.run([cross_entropy2_step1,cross_entropy2_step2])
print("step1:softmax result=\n%s\n"%(y_value))
print("step2:tf_log_result result=\n%s\n"%(tf_log_value))
print("step3:pixel_mult=\n%s\n"%(pixel_wise_mult_value))
print("step4:cross_entropy result=\n%s\n"%(cross_entropy_value))
print("Function(softmax_cross_entropy_with_logits) result=\n%s\n"%(sparse_cross_entropy2_step1_value))
print("Function(tf.reduce_sum) result=\n%s\n"%(sparse_cross_entropy2_step2_value))
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: