《深度学习实践》--第6讲 实现逻辑斯蒂回归

实现逻辑斯蒂回归

《深度学习实践》第6讲

1. 本节笔记

关于本节笔记的详细介绍,请参考: Pytorch学习笔记007——分类问题
逻辑回归的介绍,请参考:001_wz_sf_逻辑回归(Logistic Regression)

2. 关于代码的几点说明

《深度学习实践》--第6讲 实现逻辑斯蒂回归_第1张图片

1.( δ \delta δ 一般就代表逻辑斯蒂回归)
可以看出,逻辑斯蒂回归是在左边计算出 y ^ \hat{y} y^后,又增加了一步 δ \delta δ操作,即添加了激活函数(非线性变换),把实数值映射到【0,1】的区间中,再输出 y ^ \hat{y} y^
2. 分布的差异:KL散度,cross-entropy交叉熵
均值平方误差 MSE:计算的是两个实数值的差值,是数轴上的距离。
逻辑斯蒂回归函数的损失:输出的是一个分布,需要计算的是两类分布之间的差异,有 KL 散度,cross-entropy(交叉熵)。
《深度学习实践》--第6讲 实现逻辑斯蒂回归_第2张图片
说明:预测与标签越接近,BCE 损失越小。
关于交叉熵的详细介绍:请参考 链接: 一文搞懂交叉熵在机器学习中的使用,透彻理解交叉熵背后的直觉
3. 类的构造函数__init__() 没有改变:原因是, δ ( x ) \delta (x) δ(x) 是一个没有参数的函数,不需要在构造函数中进行初始化,直接调用就可以。

def __init__(self):
       super(LogisticRegressionModel,self).__init__()
       self.linear=nn.Linear(1,1)

4.数据集的标签变了,y 的取值只能是0或1。

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

由于pytorch版本的更新,可以直接使用torch.sigmoid函数进行训练。

 def forward(self,x):
        y_pred=torch.sigmoid(self.linear(x))
        return y_pred

损失函数的改变:使用BCE二分类交叉熵损失函数,其中将 size_average=False 更改为 reduction=‘sum’。

criterion=nn.BCELoss(reduction='sum')
optimizer=torch.optim.SGD(model.parameters(),lr=0.01)

3. 完整实现步骤

# 导入相应的包
import torch
import matplotlib.pyplot as plt
from torch import nn
import numpy as np
# step 1 准备数据
x_data=torch.Tensor([[1.0],[2.0],[3.0]])
y_data=torch.Tensor([[0],[0],[1]])
print(x_data.shape,y_data.shape)
# step 2 构造模型
class LogisticRegressionModel(nn.Module):
    def __init__(self):
        super(LogisticRegressionModel,self).__init__()
        self.linear=nn.Linear(1,1)
    def forward(self,x):
        y_pred=torch.sigmoid(self.linear(x))
        return y_pred
# 实例化对象
model=LogisticRegressionModel()
# 定义损失函数和优化器
criterion=nn.BCELoss(reduction='sum')
optimizer=torch.optim.SGD(model.parameters(),lr=0.01)
# step3 训练模型
total_epoch=[]
total_loss=[]
for epoch in range(1000):
    # 计算损失
    y_pred=model(x_data)
    loss=criterion(y_pred,y_data)
    print('epoch: ',epoch+1,'loss: ',loss.item())
    # 反向传播
    optimizer.zero_grad()
    loss.backward()
    # 更新权重
    optimizer.step()
    total_epoch.append(epoch+1)
    total_loss.append(loss.item())
# 打印参数
print('w=',model.linear.weight.item())
print('b=',model.linear.bias.item())
# step 4 预测
x_pred=torch.Tensor([[4.0]])
y_pred=model(x_pred)
print('y_pred:',y_pred.item())

# 损失图
plt.plot(total_epoch,total_loss)
plt.xlabel('epoch')
plt.ylabel('cost')
plt.show()

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()

《深度学习实践》--第6讲 实现逻辑斯蒂回归_第3张图片
《深度学习实践》--第6讲 实现逻辑斯蒂回归_第4张图片
《深度学习实践》--第6讲 实现逻辑斯蒂回归_第5张图片

4. 参考

  1. 《PyTorch深度学习实践》第6讲逻辑斯蒂回归视频
  2. PyTorch深度学习——逻辑斯蒂回归(分类问题)(B站刘二大人P6学习笔记)
  3. 005_wz_ledr_pytorch深度学习实战_第六讲——逻辑回归

你可能感兴趣的:(深度学习,深度学习,回归,机器学习)