机器学习读书笔记 — 交叉熵

2018-01-28  本文已影响0人  爱秋刀鱼的猫

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] 转换成概率分布,概率分布需要满足如下条件 :

这个转换成概率分布的函数就叫softmax

写一段代码,实现一下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()
image.png

概括一下,什么是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 , 小结一下

上一篇下一篇

猜你喜欢

热点阅读