文章目录
回顾
上节课利用糖尿病数据集做了二分类任务

MNIST数据集有10个类别我们又该如何进行分类呢?

使用Sigmoid构建多分类器?
之前二分类使用的是sigmoid函数进行分类,它可以把输出归一化到[0,1]之间。如果使用Sigmoid激活函数进行多分类,会出现一个问题:每个类别的概率都是[0,1]之间,他们加起来的概率和可能就不为1.我们想要的结果是满足一个分布:概率P>=0;并且概率之和=1.


SoftMax函数
其实就是对输出值y取对数,然后再除以输出的对数之和


交叉熵损失函数
标签采用One-hot编码,与预测的概率值计算损失。
- 后面部分叫做NLLLoss


- pytorch的CrossEntropyLoss=softmax+NLLLoss

例子

MINIST多分类器
数据集
MINIST数据是一个28*28像素的矩阵,如果把它线性隐射到[0,1]之间

步骤

实现
1.数据集
transforms.ToTensor()
- transform进行图像变换,将PIL图像变换为C*W *H大小的的Tensor。
- PIL库会将图片像素由[0,255]映射到[0,1]之间,方便pytorch进行运算。
transform=transforms.Compose([transforms.ToTensor(),#Convert the PIL Image to Tensor.
transforms.Normalize((0.1307,),(0.3081,))])#The parameters are mean and std respectively.

图像我们通常会有通道这个概念,可以理解为一个通道就是一个图像的矩阵。
- 灰度图片只有一个通道;
- 彩色图片:R、G、B三个通道;
- 所以一张图片其实可以表示成WHC,在Pytorch中我们需要转换为CWH,即通道数C要放在最前面。


transforms.Normalize((0.1307,),(0.3081,)) - 归一化,参数分别是均值和标准差

2.构建模型
- 将输入图像进行view,变成(N,784),然后进行训练。
- 注意最后一层线形层不需要激活函数,因为交叉熵损失函数包含了softmax激活函数。

class Net(torch.nn.Module):
def __init__(self):
super(Net,self).__init__()
self.linear1=torch.nn.Linear(784,512)
self.linear2=torch.nn.Linear(512,256)
self.linear3=torch.nn.Linear(256,128)
self.linear4=torch.nn.Linear(128,64)
self.linear5=torch.nn.Linear(64,10)
def forward(self, x):
x=x.view(-1,784)#把每一张图片的像素都拼接起来,然后变成二维(N,748)(748=28*28)
x=F.relu(self.linear1(x))
x

最低0.47元/天 解锁文章
1197

被折叠的 条评论
为什么被折叠?



