TensorFlow tf.nn.softmax_cross_entropy_with_logits

参考链接:

https://blog.csdn.net/yhily2008/article/details/80262321
https://blog.csdn.net/mao_xiao_feng/article/details/53382790
https://www.jianshu.com/p/695136c5647b

函数说明:

tf.nn.softmax_cross_entropy_with_logits(
    _sentinel=None,
    labels=None,
    logits=None,
    dim=-1,
    name=None
)

功能:
这个函数的功能就是计算labels和logits之间的交叉熵(cross entropy)
参数:
_sentinel:用于保护位置参数。内部,不使用
labels:沿类别维度的每一个向量需要具有有效概率分布,例如:当 labels 的形状为 [batch_size, num_classes],labels[i] 的每一行都必须是一个有效的概率分布
logits:为经过非线性激活函数放缩的对数概率
dim:类别维度,默认是 -1,即最后一个维度
name:可选参数,操作的名称

分步解析

1.Softmax

Softmax :
Softmax是机器学习中一个非常重要的工具,他可以兼容 logistics 算法、可以独立作为机器学习的模型进行建模训练、还可以作为深度学习的激励函数。
softmax的作用简单的说就计算一组数值中每个值的占比,公式一般性描述为:
设一共有个用数值表示的分类,其中表示分类的个数。那么softmax计算公式为:
在这里插入图片描述
例子:
A = 1 B = 2 C = 3 A = 1, B = 2,C =3
P ( A ) = e 1 e 1 + e 2 + e 3 = 0.0900305731703804 P(A) = \frac{e^1}{e^1 +e^2+e^3} = 0.0900305731703804
P ( B ) = e 2 e 1 + e 2 + e 3 = 0.2447284710547976 P(B) = \frac{e^2}{e^1 +e^2+e^3} = 0.2447284710547976
P ( C ) = e 3 e 1 + e 2 + e 3 = 0.6652409557748218 P(C) = \frac{e^3}{e^1 +e^2+e^3} = 0.6652409557748218
P ( A ) + P ( B ) + P ( C ) = 1 P(A) + P(B) + P(C) = 1

import tensorflow as tf

tensor = tf.Variable([[1.0, 2.0, 3.0]], dtype=tf.float32)

init = tf.global_variables_initializer()
with tf.Session() as sess:
    sess.run(init)
    print(sess.run(tf.nn.softmax(tensor))) 

结果输出

[[0.09003057 0.24472848 0.66524094]]

2. 交叉熵

公式为: H y ( y ) = i y i l o g ( y i ) H_{y'}(y) = -\sum_{i} y_i'log(y_i)
y_i’ 指代实际的标签(label)中第i个的值
y_i 就是 softmax的输出向量[Y1,Y2,Y3…]中,第i个元素的值显而易见,预测越准确,结果的值越小(别忘了前面还有负号),最后求一个平均,得到我们想要的loss
点乘介绍
tf.log()
tf.reduce_sum()

import tensorflow as tf
#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]], dtype=tf.float32)
#step1:do softmax
y=tf.nn.softmax(logits)
#true label
y_=tf.constant([[0.0,0.0,1.0],[0.0,0.0,1.0],[0.0,0.0,1.0]], dtype=tf.float32)
#step2:do cross_entropy
cross_entropy_step1 = y_*tf.log(y) # y_ * tf.log(y)为点乘相当于,等同于 y = tf.multiply(w, x)
cross_entropy1 = -tf.reduce_sum(cross_entropy_step1) 
#do cross_entropy just one step
cross_entropy2=tf.reduce_sum(tf.nn.softmax_cross_entropy_with_logits(logits=logits, labels=y_))#dont forget tf.reduce_sum()!!
 
with tf.Session() as sess: 
    print("softmax result=")
    print(sess.run(y))
    print("cross_entropy_step1:")
    print(sess.run(cross_entropy_step1))
    print("cross_entropy1:")
    print(sess.run(cross_entropy1))
    print("Function(softmax_cross_entropy_with_logits) result=")
    print(sess.run(cross_entropy2))

结果输出

softmax result=
[[0.09003057 0.24472848 0.66524094]
 [0.09003057 0.24472848 0.66524094]
 [0.09003057 0.24472848 0.66524094]]
cross_entropy_step1:
[[-0.         -0.         -0.407606  ]
 [-0.         -0.         -0.407606  ]
 [-0.         -0.         -0.40760598]]
cross_entropy1:
1.222818
Function(softmax_cross_entropy_with_logits) result=
1.2228179
发布了90 篇原创文章 · 获赞 9 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/wangwenjie1997/article/details/104563067