【刘二老师】pytorch深度学习笔记【06逻辑斯蒂回归】
【刘二老师】pytorch深度学习笔记【逻辑斯蒂回归】
一、分类问题概念
- 前面章节讲的都是线性回归,线性回归中估计的 “y” 属于连续的空间。
- 对于分类问题,例如MNIST数据集,y∈{0,1,2,3,4…,9},这里面的数值是类别(类别0,类别1……),不是大小。
- 因此不能让分类问题跟线性回归一样,第零个类别输出数字零,第九个类别输出数字9。因为类别之间并没有线性空间中的实数大小的含义,没有大小关系。
- 因此不算输出值是多少,而是输出的每个类的概率。
- 如果有十个类别,则这十个类别的概率加一起为1。
- 判别是哪一个类,找这十个里面概率最大的就是哪一类。
二、MNIST数据集
- pytorch提供的工具包torchvision,里面提供了相应的数据集。
- train 表示要训练集还是要测试集。
- 没下载过这个工具包,“download”设置为Ture,下载过了可以设置为False。
三、CIFAR数据集
- 括号里的和上面MNIST的一样。
四、二分类问题
- 只有两个分类就是二分类问题。
- 如图要计算“0”分类的概率是多少,“1”分类的概率是多少。但实际只需要计算一个值就可以了,因为两个概率加一起和为1。
五、输出值的映射、逻辑斯蒂函数
- 输出值的映射:
- 原来的线性模型为“y=wx+b”,输出为实数R范围。
- 现在分类问题要让输出值∈[0,1],所以要找到一个函数,把线性的输出值 R ,通过该函数映射为 [0,1]。
- 该函数就是逻辑斯蒂函数,如下图所示。
- 把线性模型中的y带入到逻辑斯蒂函数中的x。
该函数的特点:到某个值以后越往后导数越小(曲线平缓),被称为饱和函数。
其他Sigmoid函数
六、逻辑斯蒂模型
七、逻辑斯蒂模型的损失函数
y=1时,loss= - logy^,希望这个loss值越小越好,也就是y^越大越好,也就是该值越接近于1。
y=0时,loss= - log(1-y^),y^越接近于0,该loss值越小。
可以看出,y^于y越接近,loss值越小。
该损失函数叫做BCE损失。
八、该结构代码分析
importtorch# import torch.nn.functional as Fx_data=torch.Tensor([[1.0],[2.0],[3.0]])y_data=torch.Tensor([[0],[0],[1]])#这是分类,分别表示第零类,第一类。classLogisticRegressionModel(torch.nn.Module):def__init__(self):super().__init__()self.linear=torch.nn.Linear(1,1)defforward(self,x):# y_pred = F.sigmoid(self.linear(x))y_pred=torch.sigmoid(self.linear(x))returny_pred model=LogisticRegressionModel()# 默认情况下,loss会基于element平均,如果size_average=False的话,loss会被累加。criterion=torch.nn.BCELoss(size_average=False)optimizer=torch.optim.SGD(model.parameters(),lr=0.01)# training cycle forward, backward, updateforepochinrange(1000):y_pred=model(x_data)loss=criterion(y_pred,y_data)print(epoch,loss.item())optimizer.zero_grad()loss.backward()optimizer.step()print('w = ',model.linear.weight.item())print('b = ',model.linear.bias.item())x_test=torch.Tensor([[4.0]])y_test=model(x_test)print('y_pred = ',y_test.data)基本与上一节的代码结构一致,具体可以看上一节代码详解
