参考链接:
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
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(A)=e1+e2+e3e1=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(B)=e1+e2+e3e2=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(C)=e1+e2+e3e3=0.6652409557748218
P
(
A
)
+
P
(
B
)
+
P
(
C
)
=
1
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)
Hy′(y)=−i∑yi′log(yi)
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