PyTorch(六) --Logistic Regression

课程视频:传送门 Logistic Regression

Logistic Regression Model 和 Linear Model的区别是在线性模型的后面,添加了激活函数(非线性变换),激活函数作用是增加网络的非线性表达。
代码实现:

# -*- coding: UTF-8 -*-
'''===============================================
@Author :kidding
@Date   :2021/2/5 18:15
@File   :Logistic_Regression
@IDE    :PyCharm
=================================================='''
import torch
import numpy as np
import torch.nn.functional as F
import matplotlib.pyplot as plt

'''
1、准备数据集:每周学习超过3小时的代表课程考试通过,小于等于3小时的表示为未通过
'''
x_data = torch.Tensor([[1.0], [2.0], [3.0],[4.0]])
y_data = torch.Tensor([[0], [0], [0],[1]])

'''
2、Design model using Class :  inherit from nn.Module
'''
class LogisticRegressionModel(torch.nn.Module): # nn.Module 包含模型训练过程中需要用到的很多方法,需要继承
    def __init__(self): #构造函数:__init__() 是用来初始化对象时候默认调用的函数
        super(LogisticRegressionModel,self).__init__()  #调用父类的构造函数
        self.linear = torch.nn.Linear(1,1)  #构造linear对象
        '''
        (1,1)是指输入x和输出y的特征维度,这里数据集中的x和y的特征都是1维的
        该线性层需要学习的参数是w和b  获取w/b的方式分别是~linear.weight/linear.bias
        '''
    def forward(self,x): # forward() 用于计算 前向传播(前馈)
        y_pred = torch.sigmoid(self.linear(x)) #先通过Linear模块,再通过sigmoid()函数进行计算 y_hat (预测值)
        return y_pred

#实例化一个线性模型 model
model = LogisticRegressionModel()
'''
3、construct loss and optimizer
'''
# 默认情况下,loss会基于element的个数进行平均,如果size_average=False的话,loss会被累加。
criterion = torch.nn.BCELoss(size_average = False)
optimizer = torch.optim.SGD(model.parameters(), lr = 0.01)


Epoch_list =[]  #保存epoch
Loss_list = []  #保存每个epoch对应的loss

'''
4、Training Cycle : forward-->backward-->update
'''
for epoch in range(1000):
    y_pred = model(x_data)  #实现forward
    loss = criterion(y_pred,y_data)
    print("Epoch:", epoch,  "loss ={:.4f}".format(loss.item()))

    Epoch_list.append(epoch)
    Loss_list.append(loss)

    optimizer.zero_grad()   # 梯度置为0
    loss.backward() # 反向传播
    optimizer.step()    # 更新w和b的值

print("w = ",model.linear.weight.item())
print("Loss = ",model.linear.bias.item())

'''
5、Painting
'''
plt.plot(Epoch_list,Loss_list)
plt.title("SGD")
plt.ylabel('Loss')
plt.xlabel('Epoch')
plt.grid(ls='--')  # 生成网格
plt.show()

'''
6、Test model
'''
x_test = torch.Tensor([[5.0]])
y_test = model(x_test)
print("y_pred = ",y_test.data)


'''
7、画出Learning Hours相对于Probability of Pass的图像
'''
a = np.linspace(0,10,200)
a_t = torch.Tensor(a).view((200,1))
b_t = model(a_t)
b = b_t.data.numpy()
plt.plot(a,b)
plt.plot([0,10],[0.5,0.5],c='r')
plt.xlabel('Learning Hours')
plt.ylabel('Probability of Pass')
plt.grid(ls='--')  # 生成网格
plt.show()

实现效果:
在这里插入图片描述
最终显示当每周学习时间为5小时,通过率会达到80.32%
其中Loss曲线图像下图:
在这里插入图片描述
通过率随学习时间变化如下:
在这里插入图片描述
从图中可以看出,当学习时间超过3.5小时,通过概率会达到50%以上,随着时间的不断增加,通过率会逐渐上涨,无限逼近与100%。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值