CNN-卷积神经网络

【原理】softmax函数与交叉熵函数的计算公式

作者 : 老饼 发表日期 : 2023-07-28 10:45:11 更新日期 : 2024-01-31 01:44:22
本站原创文章,转载请说明来自《老饼讲解-深度学习》www.bbbdata.com



softmax函数与交叉熵函数是机器学习中类别预测最常用的两个函数

本文讲解softmax函数与交叉熵函数的计算公式,及在pytorch中如何实现两个函数




   01. softmax函数的计算公式    



本节介绍什么是softmax函数以及softmax函数的计算公式



       softmax函数介绍     


什么是softmax函数
softmax函数是深度学习中最常用的函数之一,softmax函数主要用于将数值转换为概率
 例如已经评估出样本属于0类和1类的一个数值度量为3和2,但我们更需要得到的是它属于0类和1类的概率,
那么通过softmax([3,2]),可将它转换为属于0类和1类的概率:softmax([3,2])=[0.731,0.269]

 
 
softmax函数公式
 softmax函数的计算公式如下 
       
✍️softmax例子
例如,z = [3,2],则softmax(z)为:
 





      pytorch中的softmax函数      


在pytorch中,只需使用torch.nn.Softmax函数就可实现softmax函数,如下
# -------用pytorch的softmax函数进行计算-----------------
import torch
p = torch.nn.Softmax(dim=0)(torch.tensor([3., 2.]) )
print('-----调用torch计算softmax-----')
print(p)

# ----自行用公式计算softmax,验证pytorch的softmax函数的计算逻辑-----
import math
p1 = math.exp(3)/(math.exp(3) +math.exp(2))
p2 = math.exp(2)/(math.exp(3) +math.exp(2))
print('-----用公式计算softmax-----')
print(p1,p2)
运行结果如下:
 







   02. 交叉熵损失函数    



本节介绍交叉熵损失函数的计算公式与及在pytorch中如何实现



     交叉熵损失函数公式    


交叉熵损失函数的计算公式如下:
 
其中, :样本个数               
  :类别个数     
               :第i个样本的真实类别
             :第i个样本属于第k个类别的预测概率 




     关于pytorch中的交叉熵函数     


pytorch中的CrossEntropyLoss就是交叉熵损失函数
需要注意的是,CrossEntropyLoss并不是面向概率p来计算交叉熵,而是面向数值z
CrossEntropyLoss先对z进行softmax,将z转化为p,再进行交叉熵计算
即 pytorch中的CrossEntropyLoss = CrossEntropy(softmax(z))
import torch
# 生成数据
py = torch.tensor([[0.5,0.1,0.1],[1.7,0.2,0.1],[0.9,2.7,0.1],[1.1,0.3,2.6]]) # 类别的预测值
y =  torch.tensor([0,0,1,2],dtype=torch.int64)                               # 真实类别

#-------调用pytorch函数计算交叉熵----------------------
loss= torch.nn.CrossEntropyLoss()(py,y)                                      # 调用函数计算交叉熵损失值
print('计算交叉熵损失值(调用函数)',loss.item())                              # 打印结果

# ----自行用公式计算CrossEntropyLoss,验证pytorch的CrossEntropyLoss函数的计算逻辑-----
sample_num,class_num = py.shape                                              # 样本个数与类别个数
py      = torch.nn.Softmax(dim=1)(py)                                        # 对输入进行softmax        
loss    = 0                                                                  # 初始化损失值
for i in range(class_num):                                                   # 累计每一类别的损失值
    loss = loss -torch.log(py[y==i,i]).sum()/sample_num                      # loss = loss-sum(ln(p))/m
print('计算交叉熵损失值(自行计算)',loss.item())                              # 打印结果
运行结果如下:
计算交叉熵损失值(调用函数) 0.4248943626880646  
计算交叉熵损失值(自行计算) 0.42489439249038696
 可以看到,调用CrossEntropyLoss与自行使用公式计算的结果是一致的




好了,softmax函数与交叉熵函数的计算公式就讲解到这里了~







 End 







联系老饼