参考链接:
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计算公式为:
例子:
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. 交叉熵
公式为:
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