PyTorch复现逻辑回归

【前言】

本专题为PyTorch专栏。从本专题开始,我将通过使用PyTorch编写基础神经网络,带领大家学习PyTorch。并顺便带领大家复习以下深度学习的知识。希望大家通过本专栏学习,更进一步了解人更智能这个领域。

材料来源:06.逻辑斯蒂回归_哔哩哔哩_bilibili


PyTorch编写思路

对于大部分的神经网络模型,我们应该要有以下编写思路:

1.构建数据集

2.设计模型

3.构造损失函数和优化器

4.周期训练模型

5.测试模型


【前言】本节课我们实现的是二分类,因此标签是0或1.

PyTorch数据集获取:

1. MNIST 数据集

MNIST 数据集是一个非常著名且广泛使用的手写数字识别数据集,常被用于机器学习和深度学习领域的入门实验和基准测试。

  1. 数据集内容

MNIST 数据集包含灰度化的手写数字图像及其对应的标签。具体来说:

**图像**:每个图像的大小为 28×28 像素,包含灰度值(像素值范围为 0 到 255),其中 0 表示白色背景,255 表示黑色前景。

**标签**:每个图像对应一个标签,标签是一个介于 0 到 9 的整数,表示图像中手写的数字。

  1. 数据集划分

MNIST 数据集通常分为两部分:

**训练集**:包含 60,000 张图像及其标签,用于训练模型。

**测试集**:包含 10,000 张图像及其标签,用于评估模型的性能。

python 复制代码
​
import torchvision
train_set=torchvision.datasets.MNIST(root='D:\学习\数据集\PyTorch逻辑回归数据集',train=True,download=True)
test_set=torchvision.datasets.MNIST(root='D:\学习\数据集\PyTorch逻辑回归数据集',train=False,download=True)

​

参数root:数据集保存地址

参数train:True=将数据集作为训练集,False=将数据集作为测试集

参数download:True=下载,False=不下载

2. CIFAR 数据集

CIFAR 数据集分为两个主要版本:CIFAR-10 和 CIFAR-100。

CIFAR-10

图像数量:包含 60,000 张 32×32 的彩色图像。

类别数量:分为 10 个类别,每个类别包含 6,000 张图像。

类别内容:飞机、汽车、鸟、猫、鹿、狗、青蛙、马、船、卡车。

数据划分:50,000 张训练图像和 10,000 张测试图像。

CIFAR-100

图像数量:包含 60,000 张 32×32 的彩色图像。

类别数量:分为 100 个类别,每个类别包含 600 张图像。

类别内容:类别更加丰富,例如动物、交通工具、自然场景等。

数据划分:50,000 张训练图像和 10,000 张测试图像。

  1. 数据集特点

图像尺寸小:每张图像的尺寸为 32×32 像素,适合快速实验。

类别丰富:CIFAR-10 有 10 个类别,CIFAR-100 有 100 个类别。

类别均衡:每个类别的样本数量相同,有助于模型学习。

真实场景:图像来自真实世界,具有一定的复杂性和多样性。

python 复制代码
import torchvision
train_set=torchvision.datasets.CIFAR10(root='D:\学习\数据集\PyTorch逻辑回归数据集',train=True,download=True)
test_set=torchvision.datasets.CIFAR10(root='D:\学习\数据集\PyTorch逻辑回归数据集',train=False,download=True)

参数root:数据集保存地址

参数train:True=将数据集作为训练集,False=将数据集作为测试集

参数download:True=下载,False=不下载

一、构建数据集

python 复制代码
import torch
#torch.Tensor()用来创建张量,即创建矩阵
x_data=torch.Tensor([[1.0],[2.0],[3.0]])
y_data=torch.Tensor([[0],[0],[1]])

【注意】y_data与上节课不同,因为这节课讲的是二分类问题,因此标签是0或1。


二、设计模型

1.构造计算图

当你有了一个计算图之后,你将会加深对神经网络计算过程的理解,更加便于你构造神经网络模型

2.代码实现

python 复制代码
import torch.nn.functional as F
#torch.nn.functional 是 PyTorch 中的一个模块,提供了许多用于构建神经网络的函数式接口。
#这些函数通常用于定义网络的前向传播过程,包括激活函数、损失函数、卷积操作、池化操作等。
#使用 torch.nn.functional 可以使代码更加灵活和简洁。
class LogisticRegressionModel(torch.nn.Module):
    """
    定义了一个类,继承自PyTorch的torch.nn.Module模块.
    是 PyTorch 中所有神经网络模块的基类,所有自定义的模型都应该继承自这个类。
    """  

    def __init__(self):
        #是 PyTorch 中所有神经网络模块的基类,所有自定义的模型都应该继承自这个类。
        super(LogisticRegressionModel,self).__init__()
        """
           调用了父类 torch.nn.Module 的初始化方法。这是必要的,
           因为 torch.nn.Module 的初始化方法会进行一些内部的初始化操作,确保模型能够正常工作。
        """
        self.linear=torch.nn.Linear(1,1)
        #创建了一个线性层
        #第一个参数为输入特征的数量。即输入张量的最后一个维度的大小。
        #第二个参数为输出特征的数量。即输出张量的最后一个维度的大小。

    #定义了一个前向传播
    def forward(self,x):
        y_pred=F.sigmoid(self.linear(x))
        return y_pred 
    
#类实例化    
model=LogisticRegressionModel()

代码中的注释很详细,大家仔细看一下。


三、构造损失函数和优化器

这章节我们将使用新的损失函数------交叉熵损失函数

python 复制代码
#方差损失函数
criterion=torch.nn.BCELoss(size_average=False)
#优化器optim.SGD
optimizer=torch.optim.SGD(model.parameters(),lr=0.01)

交叉熵损失函数

我们之前在深度学习中一开始学习的就是交叉熵损失函数,因此在这里再给大家复习一下

四、周期训练模型

我们定周期为1000,并打印周期内的方差损失函数的损失值

python 复制代码
for epoch in range(1000):
    y_pred=model(x_data)
    loss=criterion(y_pred,y_data)
    print(epoch,loss.item())

    optimizer.zero_grad()
    loss.backward()
    optimizer.step()

其中的函数我们上节课中讲过,如果有遗忘的话大家可以再看看上节课的文章,这里就不再过多赘述了

运行结果:

python 复制代码
0 1.754103660583496
1 1.7506103515625
2 1.7472782135009766
3 1.744094967842102
4 1.7410497665405273
5 1.7381312847137451
6 1.735330581665039
7 1.7326380014419556
8 1.7300457954406738
9 1.727545976638794
10 1.7251315116882324
11 1.7227959632873535
12 1.7205333709716797
13 1.7183377742767334
14 1.7162041664123535
15 1.7141282558441162
16 1.7121050357818604
17 1.710131049156189
18 1.7082021236419678
19 1.7063149213790894
20 1.704466700553894
21 1.7026541233062744
22 1.7008745670318604
23 1.6991257667541504
24 1.6974055767059326
...
996 0.963502049446106
997 0.9631128907203674
998 0.9627243280410767
999 0.9623361825942993
Output is truncated. View as a scrollable element or open in a text editor. Adjust cell output settings...

我们可以直观的看到,随着训练次数越来越多,损失值在不断的减少,这也就意味着模型的效果越来越好。这也就是梯度下降过程。

五、测试模型

python 复制代码
import numpy as np
import matplotlib.pyplot as plt

x=np.linspace(0,10,200)
x_test=torch.Tensor(x).view((200,1))
y_test=model(x_test)
y=y_test.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()

测试结果:

我们可以看到,这张图片其实就是Sigmoid函数的一部分。

python 复制代码
import numpy as np
import matplotlib.pyplot as plt
  • 导入了 NumPy 和 Matplotlib 的 pyplot 模块,分别用于数值计算和绘图。
python 复制代码
x = np.linspace(0, 10, 200)
  • 使用 np.linspace 创建了一个包含 200 个点的数组 x,这些点均匀分布在 0 到 10 之间。

  • 这些点将作为输入数据,用于测试模型的预测。

python 复制代码
x_test = torch.Tensor(x).view((200, 1))
  • 将 NumPy 数组 x 转换为 PyTorch 张量 x_test

  • 使用 .view((200, 1)) 将张量的形状调整为 (200, 1),表示有 200 个样本,每个样本有 1 个特征。

  • 这是因为 PyTorch 的模型通常期望输入是一个二维张量。

python 复制代码
y_test = model(x_test)
  • 将输入张量 x_test 传递给模型 model,计算模型的预测值 y_test

  • 假设 model 是一个已经训练好的模型,它会输出每个输入点对应的预测值。

python 复制代码
y = y_test.data.numpy()
  • 将 PyTorch 张量 y_test 转换为 NumPy 数组 y,以便用于绘图。

  • .data 是 PyTorch 中用于访问张量数据的属性,但请注意,在较新的 PyTorch 版本中,建议直接使用张量本身(例如 y_test.numpy())。

python 复制代码
plt.plot(x, y)
  • 使用 Matplotlib 的 plot 函数绘制输入 x 和预测值 y 的关系图。

  • 这条曲线展示了模型预测的概率随输入的变化情况。

python 复制代码
plt.plot([0, 10], [0.5, 0.5], c='r')
  • 在图上绘制一条红色的水平线,表示概率为 0.5 的阈值。

  • 这条线可以帮助观察模型预测的概率在不同输入下的位置。

python 复制代码
plt.xlabel('Hours')
plt.ylabel('Probability of Pass')
  • 设置 x 轴和 y 轴的标签,分别为 "Hours" 和 "Probability of Pass"。

  • 这表明输入 x 可能表示某种时间(例如学习时间),而输出 y 表示通过的概率。

python 复制代码
plt.grid()
  • 添加网格线,使图形更易于阅读。
python 复制代码
plt.show()
  • 显示图形。
相关推荐
牛客企业服务7 分钟前
2025年AI面试推荐榜单,数字化招聘转型优选
人工智能·python·算法·面试·职场和发展·金融·求职招聘
视觉语言导航37 分钟前
RAL-2025 | 清华大学数字孪生驱动的机器人视觉导航!VR-Robo:面向视觉机器人导航与运动的现实-模拟-现实框架
人工智能·深度学习·机器人·具身智能
**梯度已爆炸**1 小时前
自然语言处理入门
人工智能·自然语言处理
ctrlworks1 小时前
楼宇自控核心功能:实时监控设备运行,快速诊断故障,赋能设备寿命延长
人工智能·ba系统厂商·楼宇自控系统厂家·ibms系统厂家·建筑管理系统厂家·能耗监测系统厂家
BFT白芙堂2 小时前
睿尔曼系列机器人——以创新驱动未来,重塑智能协作新生态(上)
人工智能·机器学习·机器人·协作机器人·复合机器人·睿尔曼机器人
aneasystone本尊2 小时前
使用 MCP 让 Claude Code 集成外部工具
人工智能
静心问道2 小时前
SEW:无监督预训练在语音识别中的性能-效率权衡
人工智能·语音识别
羊小猪~~2 小时前
【NLP入门系列五】中文文本分类案例
人工智能·深度学习·考研·机器学习·自然语言处理·分类·数据挖掘
xwz小王子2 小时前
从LLM到WM:大语言模型如何进化成具身世界模型?
人工智能·语言模型·自然语言处理
我爱一条柴ya2 小时前
【AI大模型】深入理解 Transformer 架构:自然语言处理的革命引擎
人工智能·ai·ai作画·ai编程·ai写作