tf.nn.sparse_softmax_cross_entropy_with_logits()公式举例详解,以及与softmax_cross_entropy_with_logits()区别

tf.nn.sparse_softmax_cross_entropy_with_logits()

这是一个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=[ylogy^]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=[ylogy^+(1y)log(1y^)]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].其他过程与上面类似。

  • 7
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值