pytorch深度学习入门 第6讲(Pytorch实现逻辑斯蒂回归)

学习内容:B站 刘二大人 《pytorch深度学习实践》课程系列


逻辑斯蒂回归(Logistic Regression)

  • 虽然叫回归,但是做分类任务。

        分类任务:给定输入x,然后判断x属于y集合中的哪个类别,分类任务的model输出的是一个概率分布(包括每个类别的概率,所有概率加合为1),认定概率最大的类别为预测结果。下面看一个简单例子。

  • In classification, the output of model is the probability of input belongs to the exact class.

Logistic Function

注:并不是logistic function能够进行概率转换,而是保证概率的输出值保持在[0,1]之间,之后讨论。


逻辑回归模型

相比于以前的线性模型, 逻辑回归模型在线性层外边套了一个sigmoid函数(即logistic function)把值缩放到0~1之间,在pytorch中使用torch.nn.functional.sigmoid()函数对输出结果进行point-wise操作。


BCELoss

        线性模型中的loss,计算的是两个标量之间的差值。逻辑回归中的loss计算的是两个分布之间的差异,这个损失函数叫“二分类损失函数”,简称"BCELoss"(Binary Cross-Entropy)。

  • y=1时:loss = -ylog(y_hat)表示,在类别1时y和y_hat之间的差异,为保证概率为正,前面加负号,为了让loss最小,y_hat应该尽可能接近1.
  • y=0时:loss = -(1-y)log(1 - y_hat),带入y=0,同样也表示的是类别1的时候 y和y_hat之间的差异,为了让loss最小,y_hat应该尽可能接近0.

注:BCELoss操作会对一个mini-Batch所有的loss求和取平均。

criterion = torch.nn.BCELoss(size_average = False)
#size_average是否对每一个批量进行求平均

数据集

x(hours)y(pass/fail)
10(fail)
20(fail)
31(pass)
4?

x:学习的实践,y:有没有通过测试

注:计算概率的时候,只需要计算P(y=1)一个值就行,因为P(y=0) = 1 - P(y=1)

import torch
import torch.nn as nn
import torch.nn.functional as F

x_data = torch.Tensor([[1.0],[2.0],[3.0]])
y_data = torch.Tensor([[0],[0],[1]])

设计模型

class logisticRegressionModel(nn.Module):
    def __init__(self):
        super(logisticRegressionModel, self).__init__()
        self.linear = nn.Linear(1,1)

    def forward(self,x):
        y_pred = F.sigmoid(self.linear(x))#套一个sigmoid
        return y_pred

构建损失器和优化器

model = logisticRegressionModel()
criterion = torch.nn.BCELoss(size_average = False)
optimizer = torch.optim.SGD(model.parameters(),lr = 0.01)

循环训练

for epoch in range(1000):
    #Forward
    y_pred = model(x_data)
    loss = criterion(y_pred,y_data)
    print(epoch,loss)

    #Backward
    optimizer.zero_grad()
    loss.backward()#对loss计算过程中所有涉及的张量进行求梯度,并存放到张量w本身
    #Update
    optimizer.step()#对优化器所包含的参数进行更新

#Output
print('w = ',model.linear.weight.item())
print('b = ',model.linear.bias.item())

测试模型

#Test Model
import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(0,10,200)
x_t = torch.Tensor(x).view(200,1)
y_t = model(x_t)
y = y_t.data.numpy()
plt.plot(x,y)
plt.plot([0,10],[0.5,0.5],c = 'r')
plt.xlabel('Hours')
plt.ylabel('Probability of Pass')
plt.grid()
plt.show()

全部代码

import torch
import torch.nn as nn
import torch.nn.functional as F
import numpy as np
import matplotlib.pyplot as plt

x_data = torch.Tensor([[1.0],[2.0],[3.0]])
y_data = torch.Tensor([[0],[0],[1]])

class logisticRegressionModel(nn.Module):
    def __init__(self):
        super(logisticRegressionModel, self).__init__()
        self.linear = nn.Linear(1,1)

    def forward(self,x):
        y_pred = F.sigmoid(self.linear(x))
        return y_pred
model = logisticRegressionModel()
criterion = torch.nn.BCELoss(size_average = False)
optimizer = torch.optim.SGD(model.parameters(),lr = 0.01)#知道对哪些参数进行优化,也知道lr

for epoch in range(1000):
    #Forward
    y_pred = model(x_data)
    loss = criterion(y_pred,y_data)
    print(epoch,loss)

    #Backward
    optimizer.zero_grad()
    loss.backward()#对loss计算过程中所有涉及的张量进行求梯度,并存放到张量w本身
    #Update
    optimizer.step()#对优化器所包含的参数进行更新

#Output
print('w = ',model.linear.weight.item())
print('b = ',model.linear.bias.item())


#Test Model
x = np.linspace(0,10,200)
x_t = torch.Tensor(x).view(200,1)
y_t = model(x_t)
y = y_t.data.numpy()
plt.plot(x,y)
plt.plot([0,10],[0.5,0.5],c = 'r')
plt.xlabel('Hours')
plt.ylabel('Probability of Pass')
plt.grid()
plt.show()

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值