这两个函数的用法类似
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