概述
这是一个TensorFlow中经常需要用到的函数。官方文档里面有对它详细的说明,传入的logits为神经网络输出层的输出,shape为[batch_size,num_classes],例如3分类有64个样本就是[64,3],传入的label为一维的向量,例如(64,) (注意不是(64,1)),每一个值的取值区间必须是[0,num_classes),如果是三分类的话就是[0,1,2,0,1,2…]。下面我将举例具体说明。
首先来说,这个函数的具体实现分为了两个步骤。
(1)softmax
公式:
S
=
e
S
i
∑
i
=
1
C
e
S
i
S=frac{e^{S_{i}}}{sum_{i=1}^{C} e^{S_{i}}}
S=∑i=1CeSieSi
其实这一层只是把值归一化了,维度没有发生变化,举个例子,假如只有一个样本,3分类,神经网络输出的预测值y_hat为[[1.0, 2.0, 3.0]] (里面的值必须为float),维度(1,3)(1是样本数,3是分类数),那么经过softmax之后变为
[
e
e
+
e
2
+
e
3
,
e
2
e
+
e
2
+
e
3
,
e
3
e
+
e
2
+
e
3
]
left[frac{e}{e+e^{2}+e^{3}}, frac{e^{2}}{e+e^{2}+e^{3}}, frac{e^{3}}{e+e^{2}+e^{3}}right]
[e+e2+e3e,e+e2+e3e2,e+e2+e3e3]
结果算一下为:[[0.09,0.24473,0.6652]],加起来和为1.所以现在我们的预测值y_hat就变为[[0.09,0.24473,0.6652]]了,维度没变,还是(1,3)。
(2)计算交叉熵
我发现这个函数用的公式是:
l
o
s
s
=
−
[
y
⋅
log
y
^
]
(
1
)
loss=-[y cdot log hat{y}] (1)
loss=−[y⋅logy^](1)
而不是我之前用的(为此我纠结了好久):
l
o
s
s
=
−
[
y
⋅
log
y
^
+
(
1
−
y
)
⋅
log
(
1
−
y
^
)
]
(
2
)
loss=-[y cdot log hat{y}+(1-y) cdot log (1-hat{y})] (2)
loss=−[y⋅logy^+(1−y)⋅log(1−y^)](2)
其实这个公式一般是用于二分类的,比如logistics regression里面会用到。
好,接下来我用公式(1)来计算交叉熵,现在
y
^
hat{y}
y^是[[0.09,0.24473,0.6652]],假如真实的label为[2] (也就是第3类),维度是(1,) ,所以计算的过程是把[2]变成one-hot形式,即[[0,0,1]],把[[0.09,0.24473,0.6652]]和[[0,0,1]]代入公式(1)将对应元素计算即可,前两个是0,第三个是-1*log(0.6652) = 0.40760,跟我程序运行结果一样(这里的log是以e为底的,也就是ln) 。
贴上代码:
y_label = tf.convert_to_tensor([2], dtype=tf.int64)
y_hat = tf.convert_to_tensor([[1.0, 2.0, 3.0]], dtype=tf.float32)
c = tf.nn.sparse_softmax_cross_entropy_with_logits(logits=y_hat, labels=y_label)
print sess.run(c)
运行结果:
c = [0.40760595]
最后,顺便说一句与 softmax_cross_entropy_with_logits的区别,这个里面labels只接受one-hot标签 ,即你输入的label刚开始就要是[[0,0,1]],而不是[2].其他过程与上面类似。
最后
以上就是秀丽金鱼为你收集整理的tf.nn.sparse_softmax_cross_entropy_with_logits()公式举例详解,以及与softmax_cross_entropy_with_logits()区别的全部内容,希望文章能够帮你解决tf.nn.sparse_softmax_cross_entropy_with_logits()公式举例详解,以及与softmax_cross_entropy_with_logits()区别所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复