【阿迪的深度学习之路】softmax交叉熵计算原理分析

 

代码:

if __name__ == '__main__':

    import tensorflow as tf
    import numpy as np     
    import math
    
    #真实标签
    labels = [0,0,0,1,0]
    
    #模型输出,即为最后一层全连接层输出
    logits = [2, 0.4, 6,4,1]

    #使用softmax函数计算softmax 
    logits_softmax_1 = tf.nn.softmax(logits)

    #使用softmax_cross_entropy_with_logits函数计算softmax交叉熵
    logits_softmax_cross_entropy_1 = tf.nn.softmax_cross_entropy_with_logits(labels = labels, logits = logits)

    #单独计算softmax 
    logits_exp = [math.exp(i) for i in logits]
    sum_logits_exp = sum(logits_exp)
    logits_softmax_2 = [round(i / sum_logits_exp, 8) for i in logits_exp]
    
    #单独计算交叉熵     
    logits_softmax_cross_entropy_2 = -tf.reduce_sum(labels*tf.log(logits_softmax_2),0)
          
    with tf.Session() as sess:    
       print("logits_softmax_1 = " , np.array(sess.run(logits_softmax_1)))    
       print("logits_softmax_cross_entropy_1 = ",sess.run(logits_softmax_cross_entropy_1),"\n")

       print("logits_softmax_2 = " , np.array(logits_softmax_2))    
       print("logits_softmax_cross_entropy_2 = ",sess.run(logits_softmax_cross_entropy_2),"\n")
         
else:
    raise Exception('main.py: Should Not Be Imported!!! Must Run by "python main.py"')

打印:

logits_softmax_1 =  [0.01573391 0.00317662 0.85904247 0.11625876 0.00578818]
logits_softmax_cross_entropy_1 =  2.151937

logits_softmax_2 =  [0.01573391 0.00317662 0.85904252 0.11625876 0.00578818]
logits_softmax_cross_entropy_2 =  2.1519368

 

对于LOSS,我的理解如下,反过来理解:

softmax值域范围为(0,1),训练目的要求分类概率趋近于1(如图红线所示),即要求y=log(x) 趋近于0(如图蓝线所示);

所以训练过程就是寻找y的最小值,y值即为loss,即寻找loss的最小值,具体怎么去寻找,交给模型去做了。

 

数学公式推理过程参考:卷积神经网络系列之softmax,softmax loss和cross entropy的讲解 https://blog.csdn.net/u014380165/article/details/77284921

 

posted @ 2019-06-16 12:47  赤热之冰  阅读(82)  评论(0编辑  收藏  举报