TensorFlow上没有直接可以调用损失函数的库的类,所以需要自己拼装一个损失函数.
在解决深度学习领域一些问题时,交叉熵用于刻画两个概率分布向量之间的距离,是分类问题中使用比较广的一种损失函数.(用于判断概率问题正确值与预测值之间差距)
H
(
P
,
Q
)
=
−
∑
x
P
(
x
)
l
o
g
Q
(
x
)
H(P,Q)= -\displaystyle\sum_{x}P(x)logQ(x)
H(P,Q)=−x∑P(x)logQ(x)
在使用交叉熵时,一般设定P代表的是正确答案,Q代表的是预测答案
例如在理想情况下,有一个样本属于类别k,这个类别所对应输出节点的输出值应该为1,其他节点的输出都为0
有两个输出结果[0.1,0.8,0.1,0,0,] 和 [0.2,0.5,0.2,0.1,0] ,越靠近1的数,输出节点的输出值为1,那么将这两组答案用交叉熵计算得
H
(
P
,
Q
)
=
−
(
∑
x
0
H(P,Q)= -(\displaystyle\sum_{x}0
H(P,Q)=−(x∑0 x
l
o
g
0.1
+
1
log0.1+1
log0.1+1x
l
o
g
0.8
log0.8
log0.8 + 0 x
l
o
g
0.1
+
0
log0.1+0
log0.1+0 x
l
o
g
0
+
0
log0 +0
log0+0 x
l
o
g
0
)
≈
0.096
log0)\approx0.096
log0)≈0.096
H ( P , Q ) = − ( ∑ x 0 H(P,Q)= -(\displaystyle\sum_{x}0 H(P,Q)=−(x∑0 x l o g 0.2 + 1 log0.2+1 log0.2+1x l o g 0.5 log0.5 log0.5 + 0 x l o g 0.2 + 0 log0.2+0 log0.2+0 x l o g 0.1 + 0 log0.1 +0 log0.1+0 x l o g 0 ) ≈ 0.3 log0)\approx0.3 log0)≈0.3
所以选择交叉熵值最小的那个
Tensorflow 中没有计算交叉熵这个类,但是有散装函数
tf.reduce_mean()函数来计算平均值
tf.log()计算对数
tf.clip_by_value()限制一个范围让log()函数的取值在1e-10~1.0之间,保证对数在运算中不会违反运算规则
tf.log(tf.clip_by_value(y,1e-10,1.0))这样log的取值就不会违反对数运算规则
将交叉熵的式子才开来解释 就是 负的数学期望(平均值),样本p*log函数
H_PQ=-tf.reduce_mean(p_*tf.log(tf.clip_by_value(p,1e-10,1.0)))
p_表示标签保存的真实答案向量
注意的是,如果p_是一个矩阵," * "相乘与函数tf.matmul()相乘的区别,使用 " * “相乘是矩阵中对应的元素相乘,而tf.matmul()是矩阵与矩阵相乘.
对于交叉熵计算来说,显然使用” * "相乘的方式更合理,简洁.