1. 交叉熵能干什么
在机器学习里面,解决多分类的问题(比如识别手写字符),一般会用one-hot的向量去表示分类的结果。如下图所示,表示 0-9 十个类中一个类的 one-hot 向量。
假设实际图像上是数字 “1”,它的 one-hot 向量是 [0,1,0,0,0,0,0,0,0,0],假设其预测向量 (y) [1.3, 33, 2, 1.2, 3.2, 0.5, 3, 9.2, 1],绘制比较如下:
对于网络产生的预测的输出和真实的输出,要计算一个cost,作为评价网络模型好坏的cost。这个时候,就是发挥交叉熵作用的时候了。
2.什么是交叉熵
为了利用交叉熵,我们需要将 预测向量 y= [1.3, 10, 2, 1.2, 3.2, 0.5, 3, 9.2, 1] 转换成概率分布,概率分布需要满足如下条件 :
- 每个类的概率/分数值在 0-1 之间;
- 所以类的概率/分数和必须是 1;
写一段代码,实现一下softmax(注意softmax并不是交叉熵!)。将 预测向量y= [1.3, 10, 2, 1.2, 3.2, 0.5, 3, 9.2, 1] 转换成概率分布。
import math
import matplotlib.pyplot as plt
def softmax(y):
res=[]
for i in y:
res.append(math.exp(i))
res_sum=sum(res)
softmax_res = [ i/float(res_sum) for i in res]
return softmax_res
if __name__ =="__main__":
y = [1.3, 10, 2, 1.2, 3.2, 0.5, 3, 9.2, 1]
res=softmax(y)
plt.plot(res)
plt.show()
概括一下,什么是softmax?
softmax是一个针对多类分类,输出的是每一个分类的概率。
重点来了,到了交叉熵的部分啦
最后一步,就求解交叉熵:
写一个代码,实现计算一下交叉熵。
计算一下 y_true = [0,1,0,0,0,0,0,0,0] , y = [1.3, 10, 2, 1.2, 3.2, 0.5, 3, 9.2, 1]的交叉熵。
import math
import matplotlib.pyplot as plt
def softmax(y):
res=[]
for i in y:
res.append(math.exp(i))
res_sum=sum(res)
softmax_res = [ i/float(res_sum) for i in res]
return softmax_res
#tf里面有这个函数,可以很方便的计算交叉熵 tf.nn.softmax_cross_entropy_with_logits(labels=y_true, logits=y)
def cross_entroy(y_true,y):
softmax_res = softmax(y)
log_res = list(map(math.log,softmax_res))
cross_entroy =0.0
for i,j in zip(y_true,log_res):
cross_entroy=cross_entroy + i * j
return -cross_entroy
if __name__ =="__main__":
y_true = [0,1,0,0,0,0,0,0,0]
y = [1.3, 10, 2, 1.2, 3.2, 0.5, 3, 9.2, 1]
print (cross_entroy(y_true,y)) # 0.3730835485063131
tensorflow里面也有计算交叉熵的
import tensorflow as tf
y_true = [0,1,0,0,0,0,0,0,0]
y = [1.3, 10, 2, 1.2, 3.2, 0.5, 3, 9.2, 1]
sess = tf.Session()
print (sess.run(tf.nn.softmax_cross_entropy_with_logits(labels=y_true, logits=y)))
# 0.373083
so , 小结一下
- 交叉熵在机器学习里面是用来计算多分类问题的cost
- softmax是计算交叉熵的一个步骤,和交叉熵是区别的
- softmax是将一个向量转换成它的概率分布