1、交叉熵计算公式
http://blog.youkuaiyun.com/rtygbwwwerr/article/details/50778098
摘自上面链接
p:真实样本分布,服从参数为p的0-1分布,即
X∼B(1,p)
q:待估计的模型,服从参数为q的0-1分布,即
X∼B(1,q)
两者的交叉熵为:
CEH(p,q)
=−∑x∈p(x)logq(x)
=−[Pp(x=1)logPq(x=1)+Pp(x=0)logPq(x=0)]
=−[plogq+(1−p)log(1−q)]
=−[yloghθ(x)+(1−y)log(1−hθ(x))]
对所有训练样本取均值得:
−1m∑i=1m[y(i)loghθ(x(i))+(1−y(i))log(1−hθ(x(i)))]
这个结果与通过最大似然估计方法求出来的结果一致。
-- 总结来看,交叉熵,就是 - sum(这个类别的真实label*log(分类器预测属于这个类别的概率)), sum针对所有的类做
2、tf.softmax_cross_entropy_with_logits
传入参数, logits, labels
内部实现逻辑,首先对logits做softmax,然后对logits取log,最后 log的结果和labels对应相乘
代码示例
import tensorflow as tf
labels = [[0.2,0.3,0.5],
[0.1,0.6,0.3]]
logits = [[2,0.5,1],
[0.1,1,3]]
logits_scaled = tf.nn.softmax(logits)
result1 = tf.nn.softmax_cross_entropy_with_logits(labels=labels, logits=logits)
result2 = -tf.reduce_sum(labels*tf.log(logits_scaled),1)
result3 = tf.nn.softmax_cross_entropy_with_logits(labels=labels, logits=logits_scaled)
with tf.Session() as sess:
print sess.run(result1)
print sess.run(result2)
print sess.run(result3)
>>>[ 1.41436887 1.66425455]
>>>[ 1.41436887 1.66425455]
>>>[ 1.17185783 1.17571414]
上述例子中,labels的每一行是一个概率分布,而logits未经缩放(每行加起来不为1),我们用定义法计算得到交叉熵result2,和套用tf.nn.softmax_cross_entropy_with_logits()得到相同的结果, 但是将缩放后的logits_scaled输tf.nn.softmax_cross_entropy_with_logits(), 却得到错误的结果,所以一定要注意,这个操作的输入logits是未经缩放的
例子摘自http://blog.youkuaiyun.com/john_xyz/article/details/612114223、sparse_softmax_cross_entropy_with_logits
输入:logits、labels
和softmax_cross_entropy_with_logits区别就一点,labels是稀疏表示的, 比如三分类问题,在softmax_cross_entropy_with_logits函数,如果是第二类,label是[0, 1, 0],如果在sparse_softmax)cross_entropy_with_logits, 输入的label就是[1],也就是第一维是1,其他都是0。