使用Pytorch写简单线性回归

文章目录

Pytorch

一、Pytorch 介绍

PyTorch 是一个开源的深度学习框架,由 Facebook 的人工智能研究团队开发。它主要用于构建和训练深度学习模型,具有以下特点:

动态计算图:PyTorch 使用动态计算图,这意味着可以在运行时动态地构建、修改和执行计算图,使得开发和调试更加灵活。

易于使用:提供了简洁直观的 API,使得开发者可以快速上手,专注于模型的设计和实现。

强大的 GPU 加速:支持在 GPU 上进行高效的并行计算,大大加快了训练和推理的速度。

广泛的社区支持:拥有庞大的开发者社区,提供了丰富的教程、示例和第三方扩展。

二、概念

张量(Tensor):是 PyTorch 中的基本数据结构,类似于多维数组,可以在 CPUGPU 上存储和操作数据。

自动求导(Autograd):PyTorch 能够自动计算张量的梯度,这对于训练深度学习模型非常重要,因为它可以通过反向传播算法自动更新模型参数。

模块(Module):是 PyTorch 中构建模型的基本单元,可以包含多个子模块和参数。

优化器(Optimizer):用于优化模型参数,常见的优化算法如随机梯度下降(SGD)、Adam 等。

损失函数(Loss Function):用于衡量模型预测与真实值之间的差异,常见的损失函数有均方误差(MSE)、交叉熵损失等。

三、应用于简单线性回归

线性回归是一种简单的机器学习算法,用于预测一个连续的数值。下面是使用 PyTorch 实现简单线性回归的步骤:

准备数据:

生成一些随机的输入数据和对应的输出数据。例如,假设我们要拟合一个线性函数 y = 2x + 1,可以生成一些随机的 x 值,并计算出对应的 y 值。

定义模型:

使用 PyTorch 的模块类定义一个简单的线性回归模型。这个模型通常包含一个线性层,即一个全连接层,它将输入特征映射到输出。

定义损失函数和优化器:

选择一个合适的损失函数,如均方误差(MSE)损失。

选择一个优化器,如随机梯度下降(SGD)优化器,并设置学习率等参数。

训练模型:

将数据分成小批次,每次输入一个批次的数据到模型中进行前向传播,计算损失。

然后进行反向传播,计算梯度,并使用优化器更新模型参数。

重复这个过程直到达到预定的训练次数或损失收敛。

测试模型:

使用训练好的模型对新的数据进行预测,评估模型的性能。

1.代码框架

2.引用

python 复制代码
import torch        
from torch import nn
from torch import optim

3.继续模型

继承模型主要都是在nn.Module类

(1)要定义一个模型,需要继承nn.Module

python 复制代码
class EIModel(nn.Module):
    def __init__(self):
        super(EIModel,self).__init__()   #等价于super().__init__()  
        self.linear=nn.Linear(in_features=1,out_features=1)   #创建线性层

    def forward(self,inputs):
        logits=self.linear(inputs)
        return logits   

注:forward()return切记要写上

(2)如果函数的参数不具体指定,那么就需要在__init__函数中添加未指定的变量:

python 复制代码
class EIModel(nn.Module):
    def __init__(self,in_features,out_features):
        super(EIModel,self).__init__()
        self.linear=nn.Linear(in_features,out_features)  

    def forward(self,inputs):
        logits=self.linear(inputs)
        return logits

注:这时在实例化模型时,函数内要指定参数:

python 复制代码
model = EIModel(in_features=1,out_features=1)

2.定义数据

python 复制代码
x_list=[0,1,2,3,4]
y_list=[2,3,4,5,8]

x_numpy=np.array(x_list,dtype=np.float32)
x=torch.from_numpy(x_numpy.reshape(-1,1))
y_numpy=np.array(y_list,dtype=np.float32)
y=torch.from_numpy(y_numpy.reshape(-1,1))

3.实例化模型

python 复制代码
model = EIModel()

直接调用模型

python 复制代码
import torchvision.models as models
models.resnet50()

测试模型预测结果

python 复制代码
outputs=model(x)
print(outputs)

结果:

python 复制代码
tensor([[-0.9462],
        [-1.4654],
        [-1.9846],
        [-2.5038],
        [-3.0230]], grad_fn=<AddmmBackward>)

4.损失函数

nn.MSELoss()定义均方误差损失计算函数

(1)loss_f=nn.MSELoss()

(2)loss_f=nn.CrossEntropyLoss()

5.优化器

torch.optim.SGD()是一个内置的优化器

它的第一个参数是需要优化的变量,可以通过model.parameters()方法获取模型中所有变量
lr=0.0001定义学习率

(1)opt=torch.optim.SGD(model.parameters(),lr=0.0001)

(2)optimizer_ft=optim.Adam(params_to_update,lr=1e-2)

Adam优点:可以自动调整学习效率

6.模型训练

(1)因为pytorch会累积每次计算的梯度,所以需要将上一循环中的计算的梯度归零

将全部数据训练一遍称为一个epoch,这里训练了500epoch

python 复制代码
for epoch in range(500):
    for x_index,y_index in zip(x,y): #同时对x和y迭代
        y_pred=model(x_index)        #等价于model.forward(inputs)
        loss=loss_f(y_pred,y_index)  #根据模型预测输出与实际值y_index计算损失
        opt.zero_grad()              #将累计的梯度清0
        loss.backward()              #反向传播损失,计算损失与模型参数之间的梯度
        opt.step()                   #根据计算得到梯度优化模型参数

(2)将损失误差打印出来

python 复制代码
for epoch in range(500):
    for x_index,y_index in zip(x,y):   
        y_pred=model(x_index)
        loss=loss_f(y_pred,y_index)
        opt.zero_grad()     #将累计的梯度清0
        loss.backward()     #反向传播损失,计算损失与模型参数之间的梯度
        opt.step()          #根据计算得到梯度优化模型参数

    if (epoch + 1) % 50 == 0:
        print(f'epoch:{epoch + 1}, loss = {loss.item():.4f}')

结果:

python 复制代码
epoch:50, loss = 12.1212
epoch:100, loss = 7.1772
epoch:150, loss = 4.4344
epoch:200, loss = 2.8781
epoch:250, loss = 1.9724
epoch:300, loss = 1.4308
epoch:350, loss = 1.0978
epoch:400, loss = 0.8877
epoch:450, loss = 0.7521
epoch:500, loss = 0.6629

参数名称和值:
model.named_parameters()可以以生成器的形式返回模型参数的名称和值

python 复制代码
print(list(model.named_parameters()))

结果:

python 复制代码
[('linear.weight', Parameter containing:tensor([[1.4773]], requires_grad=True)), 
('linear.bias', Parameter containing:tensor([1.2792], requires_grad=True))]

单独查看权重/偏置:

python 复制代码
print(model.linear.weight)
print(model.linear.bias)

7.绘制数据

使用tensor.detach()方法获得具有相同内容但不需要跟踪运算的新张量,可以认为是获取张量的值

python 复制代码
plt.scatter(x_list,y_list,label='scatter plot')
plt.plot(x,model(x).detach().numpy(),c='r',label='line plot')
plt.legend()
plt.show()

结果:

相关推荐
Hylan_J2 小时前
【VSCode】MicroPython环境配置
ide·vscode·python·编辑器
莫忘初心丶3 小时前
在 Ubuntu 22 上使用 Gunicorn 启动 Flask 应用程序
python·ubuntu·flask·gunicorn
万事可爱^4 小时前
HDBSCAN:密度自适应的层次聚类算法解析与实践
算法·机器学习·数据挖掘·聚类·hdbscan
失败尽常态5235 小时前
用Python实现Excel数据同步到飞书文档
python·excel·飞书
2501_904447745 小时前
OPPO发布新型折叠屏手机 起售价8999
python·智能手机·django·virtualenv·pygame
青龙小码农5 小时前
yum报错:bash: /usr/bin/yum: /usr/bin/python: 坏的解释器:没有那个文件或目录
开发语言·python·bash·liunx
大数据追光猿5 小时前
Python应用算法之贪心算法理解和实践
大数据·开发语言·人工智能·python·深度学习·算法·贪心算法
Leuanghing6 小时前
【Leetcode】11. 盛最多水的容器
python·算法·leetcode
xinxiyinhe7 小时前
如何设置Cursor中.cursorrules文件
人工智能·python
若兰幽竹7 小时前
【机器学习】多元线性回归算法和正规方程解求解
算法·机器学习·线性回归