softmax_cross_entropy_with_logits_v2 计算的是什么玩意?

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

猜你喜欢

转载自blog.csdn.net/brooknew/article/details/82464367