pytorch多分类问题

多分类问题

  • softmax分类器

对于多分类,假如我们对每个输出层的神经元用sigmoid输出,并用交叉熵损失进行训练,那么可能会产生一个模糊的结果,比如对于某一输入,第一类的输出概率为0.8,第二类的输出概率为0.8,第三类的为0.9那么我们应该选择哪个结果?

所以,对于多分类,我们希望输出层的神经元之间是有竞争的,我们希望神经网络输出的是一个分布,每个输出大于0,且和为1
假设 Z l ∈ R k Z^l\in R^k ZlRk是神经网络的输出层,softmax函数:
P ( y = i ) = e Z i ∑ j = 0 K − 1 e Z j , i ∈ { 0 , . . . , K − 1 } P(y=i)=\frac{e^{Z_i}}{\sum^{K-1}_{j=0}e^{Z_j}},i\in \{0,...,K-1\} P(y=i)=j=0K1eZjeZi,i{ 0,...,K1}
利用指数运算:结果永远大于0
分母求和:满足和为1

损失函数?
对于二分类,损失函数就是交叉熵损失: y l o g y ^ + ( 1 − y ) l o g ( 1 − y ^ ) ylog\hat y+(1-y)log (1-\hat y) ylogy^+(1y)log(1y^)

对于多分类,我们也使用交叉熵损失,但是我们只要一半就好了,因为对于多分类,另一半没有意义
pytorch多分类问题_第1张图片
直接将标签向量和预测值向量取对数对应相乘即可

import torch
criterion = torch.nn.CrossEntropyLoss() # 实例化一个交叉熵损失,这个交叉熵损失是带有softmax函数的输出
                                        # 所以,使用torch.nn.CrossEntropyLoss()时,不需要再使用softmax函数了
Y = torch.LongTensor([2,0,1]) # 有三个样本 这里直接是每个样本的标签索引
                              # 比如,这里三个第一个代表第一个样本是第三个类别,第二个样本代表第1类,
                              # 第三个样本代表第2类
Y_pred1 = torch.Tensor([[0.1,0.2,0.9],   # 张量可以理解为多个多维向量组成的数据结构
                        [1.1,0.1,0.2],
                        [0.2,2.1,0.1]])
Y_pred2 = torch.Tensor([[0.8,0.2,0.3],
                        [0.2,0.3,0.5],
                        [0.2,0.2,0.5]])
l1 = criterion(Y_pred1,Y)
l2 = criterion(Y_pred2,Y)
print("Batch Loss1 = ",l1.data,"\n Batch Loss2=",l2.data)

你可能感兴趣的:(深度学习,pytorch,多分类问题)