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′=−∑iy′ilog(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