Tensorflow 里通过softmax后再计算交叉熵有2个函数:
1 softmax_cross_entropy_with_logits_v2
2 sparse_softmax_cross_entropy_with_logits
均涉及两个参数,logits 和 labels ,logits 一般是神经网络的输出,是一个batch乘待分类类型数的二维张量。而labels是已知的标注,同样shape的张量。第二个函数的labels是稀疏表示的labels,因而是一维张量。
设logits1=[ [0.2, 0.1, 0.9]] ,labels1=[[0, 0, 1]],通过softmax_cross_entropy_with_logits_v2(logits=logits1,labels=labels1)的计算过程如下:
对[0.2, 0.1, 0.9]运算softmax ,得到 sm= [0.25519383 0.23090893 0.51389724] ,然后,
交叉熵= — ( log(sm[0])*labels1[0][0] + log(sm[1])*labels1[0][1] + log(sm[2])*labels1[0][2] ).请看下面的代码例子,分别使用提供的两个函数算交叉熵,还有通过自己调用softmax算,然后直接根据上式计算,三者计算结果一致。
import tensorflow as tf
import math
input_data = tf.Variable([ [0.2, 0.1, 0.9] , [0.2, 0.1, 0.9], [0.7, 0.4, 0.1]], dtype=tf.float32)
labels1=[[0, 0, 1], [0, 1, 0] , [1, 0, 0]]
output = tf.nn.softmax_cross_entropy_with_logits_v2(logits=input_data, labels=labels1 )
labels2 = tf.argmax(labels1,1 )
output1 = tf.nn.sparse_softmax_cross_entropy_with_logits(logits=input_data, labels=labels2 )
sm = tf.nn.softmax ( input_data )
with tf.Session() as sess:
init = tf.global_variables_initializer()
sess.run(init)
our = sess.run(output)
print('softmax_cross_entropy_with_logits_v2:\n', our)
our1 = sess.run(output1)
print('sparse_softmax_cross_entropy_with_logits:\n', our)
inp= sess.run( input_data )
smv = sess.run( sm )
print( 'softmax output:\n', smv )
l2 = sess.run( labels2 )
print ('argmax output(sparse labels)', l2 )
for k in range(len(inp) ) :
x = 0.0
for i in range(len(inp[0])) :
x += math.log( smv[k][i] ) * labels1[k][i]
x = -x
print( 'softmax_cross_entropy_with_logits by my computing for input ' , k ,':', x )
#print( 'tensorflow == myComputing?' , math.fabs( x - our[k] ) < 0.001 )
输出结果:
softmax_cross_entropy_with_logits_v2:
[0.6657319 1.4657319 0.8283902]
sparse_softmax_cross_entropy_with_logits:
[0.6657319 1.4657319 0.8283902]
softmax output:
[[0.25519383 0.23090893 0.51389724]
[0.25519383 0.23090893 0.51389724]
[0.4367518 0.3235537 0.23969449]]
argmax output(sparse labels) [2 1 0]
softmax_cross_entropy_with_logits by my computing for input 0 : 0.6657319553780278
softmax_cross_entropy_with_logits by my computing for input 1 : 1.4657318873121323
softmax_cross_entropy_with_logits by my computing for input 2 : 0.8283901795553891