tf.nn.sparse_softmax_cross_entropy_with_logits()与tf.nn.softmax_cross_entropy_with_logits的差别

这两个函数的用法类似

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

唯一的区别是sparse的labels是int类型,而非sparse的labels是one-hot类型。

具体代码用法


import tensorflow as tf

#代码段1,手动算出代价函数
# 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)

#代码段2,使用tf.nn.softmax_cross_entropy_with_logits算出代价函数
cross_entropy2=tf.reduce_sum(tf.nn.softmax_cross_entropy_with_logits(logits=logits, labels=y_))#dont forget tf.reduce_sum()!! 

#代码段3,使用tf.nn.sparse_softmax_cross_entropy_with_logits()算出代价函数
# 将标签稠密化
dense_y = tf.arg_max(y_, 1)
cross_entropy3 = tf.reduce_sum(tf.nn.sparse_softmax_cross_entropy_with_logits(labels=dense_y, logits=logits))

#代码段4,验证结果
with tf.Session() as sess:
    result1,result2,result3 = sess.run(
        (cross_entropy,cross_entropy2,cross_entropy3))
    print("method1 : %s" % result1)
    print("method2 : %s" % result2)
    print("method3 : %s" % result3)

    #输出结果
    '''
    method1 : 1.222818
    method2 : 1.2228179
    method3 : 1.2228179
    '''

参考

https://www.jianshu.com/p/648d791b55b0
https://blog.csdn.net/m0_37041325/article/details/77043598

记录时间

2018/9/11 21:28
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值