【阿迪的深度学习之路】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