课程视频:传送门 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%。