【刘二老师】pytorch深度学习笔记【06逻辑斯蒂回归】

【刘二老师】pytorch深度学习笔记【06逻辑斯蒂回归】

【刘二老师】pytorch深度学习笔记【逻辑斯蒂回归】

一、分类问题概念

  1. 前面章节讲的都是线性回归,线性回归中估计的 “y” 属于连续的空间。
  2. 对于分类问题,例如MNIST数据集,y∈{0,1,2,3,4…,9},这里面的数值是类别(类别0,类别1……),不是大小。
  3. 因此不能让分类问题跟线性回归一样,第零个类别输出数字零,第九个类别输出数字9。因为类别之间并没有线性空间中的实数大小的含义,没有大小关系。
  4. 因此不算输出值是多少,而是输出的每个类的概率。
  5. 如果有十个类别,则这十个类别的概率加一起为1。
  6. 判别是哪一个类,找这十个里面概率最大的就是哪一类。

二、MNIST数据集

  • pytorch提供的工具包torchvision,里面提供了相应的数据集。
  • train 表示要训练集还是要测试集。
  • 没下载过这个工具包,“download”设置为Ture,下载过了可以设置为False。

三、CIFAR数据集

  • 括号里的和上面MNIST的一样。

四、二分类问题

  • 只有两个分类就是二分类问题。
  • 如图要计算“0”分类的概率是多少,“1”分类的概率是多少。但实际只需要计算一个值就可以了,因为两个概率加一起和为1。

五、输出值的映射、逻辑斯蒂函数

  1. 输出值的映射
  • 原来的线性模型为“y=wx+b”,输出为实数R范围。
  • 现在分类问题要让输出值∈[0,1],所以要找到一个函数,把线性的输出值 R ,通过该函数映射为 [0,1]。
  • 该函数就是逻辑斯蒂函数,如下图所示。
  • 把线性模型中的y带入到逻辑斯蒂函数中的x。
  1. 该函数的特点:到某个值以后越往后导数越小(曲线平缓),被称为饱和函数。

  2. 其他Sigmoid函数

六、逻辑斯蒂模型

七、逻辑斯蒂模型的损失函数

  1. y=1时,loss= - logy^,希望这个loss值越小越好,也就是y^越大越好,也就是该值越接近于1。

  2. y=0时,loss= - log(1-y^),y^越接近于0,该loss值越小。

  3. 可以看出,y^于y越接近,loss值越小。

  4. 该损失函数叫做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)

基本与上一节的代码结构一致,具体可以看上一节代码详解