TensorFlow学习--tf.nn.sparse_softmax_cross_entropy_with_logits

tf.nn.sparse_softmax_cross_entropy_with_logits() 计算logits和labels之间的稀疏softmax交叉熵.
一般与tf.reduce_sum()结合用来求交叉熵损失.

计算交叉熵

假设神经某网络最后一层的输出(未归一化的概率)为[1.0, 2.0, 2.0], [3.0, 1.0, 1.0], [3.0, 2.0, 1.0].对应的标签分别为1,2,0.则求交叉熵过程为:
首先将标签值用one-hot编码稀疏化,即[0, 1.0, 0.0], [0, 0, 1.0], [1.0, 0.0, 0].
然后,根据 Hy=iyilog(yi) H y ′ = − ∑ i y i ′ l o g ( y i ) 计算交叉熵.
计算过程:

#!/usr/bin/python
# coding:utf-8
import tensorflow as tf
logits = tf.constant([[1.0, 2.0, 2.0], [3.0, 1.0, 1.0], [3.0, 2.0, 1.0]])
y = tf.nn.softmax(logits)
# 稀疏标签
labels = tf.constant([[0, 1.0, 0.0], [0, 0, 1.0], [1.0, 0.0, 0]])  
cross_entropy = -tf.reduce_sum(tf.multiply(labels, tf.log(y)))
with tf.Session() as sess:
    cross_entropy_value = sess.run(cross_entropy)
    print("cross_entropy_value=\n%s" % (cross_entropy_value))

输出:

cross_entropy_value=
3.50915
tf.nn.softmax_cross_entropy_with_logits()

使用tf.nn.softmax_cross_entropy_with_logits()计算logits和labels之间的softmax交叉熵.据tensorflow文档描述,这个函数将逐渐被废弃,未来将被删除.
测量类别相互排斥的离散分类任务中的概率错误(每个条目恰好在一个类别中)

  • labels:每行labels[i]必须是有效的概率分布.
  • logits:未归一化的对数概率.
  • dim:类维度.默认为-1,即最后一个维度.
  • name:操作的名称(可选项)

logits并且labels必须具有相同的形状和类型(float16,float32,或float64).

示例:

#!/usr/bin/python
# coding:utf-8
import tensorflow as tf

logits = tf.constant([[1.0, 2.0, 2.0], [3.0, 1.0, 1.0], [3.0, 2.0, 1.0]])
# 稀疏标签
labels = tf.constant([[0, 1.0, 0.0], [0, 0, 1.0], [1.0, 0.0, 0]])
softmax_cross_entropy = tf.nn.softmax_cross_entropy_with_logits(labels=labels, logits=logits)
cross_entropy = tf.reduce_sum(softmax_cross_entropy)

with tf.Session() as sess:
    cross_entropy_value = sess.run(cross_entropy)
    print("cross_entropy_value=\n %s" % (cross_entropy_value))

输出:

cross_entropy_value=
 3.50915
tf.nn.sparse_softmax_cross_entropy_with_logits()

tf.nn.sparse_softmax_cross_entropy_with_logits() 计算logits和labels之间的稀疏softmax交叉熵.
tf.nn.sparse_softmax_cross_entropy_with_logits()比tf.nn.softmax_cross_entropy_with_logits内部多了将labels稀疏化的操作.
参数:

  • labels:张量形状为[d_0, d_1, …, d_{r-1}],数据类型为int32或int64;labels的每个值必须是在[0, num_classes)之间.
  • logits:数据类型必须为float32或float64.
  • name:操作的名称(可选项)
    logits并且labels必须具有相同的形状和类型.

示例:
这里标签是非稀疏的.

#!/usr/bin/python
# coding:utf-8
import tensorflow as tf

logits = tf.constant([[1.0, 2.0, 2.0], [3.0, 1.0, 1.0], [3.0, 2.0, 1.0]])
# 非稀疏标签
labels = tf.constant([1, 2, 0])
softmax_cross_entropy = tf.nn.sparse_softmax_cross_entropy_with_logits(labels=labels, logits=logits)
cross_entropy = tf.reduce_sum(softmax_cross_entropy)

with tf.Session() as sess:
    cross_entropy_value = sess.run(cross_entropy)
    print("cross_entropy_value=\n %s" % (cross_entropy_value))

输出:

cross_entropy_value=
 3.50915
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值