首页 > 其他分享 >深度学习(三)2.利用pytorch实现线性回归

深度学习(三)2.利用pytorch实现线性回归

时间:2024-11-10 19:46:03浏览次数:5  
标签:tensor grad self torch pytorch 深度 线性 梯度 data

一、基础概念

1.线性层

  • 线性层(Linear Layer)是神经网络中的一种基本层,也称为全连接层(Fully Connected Layer)。
  • 它的工作方式类似于简单的线性方程:y = Wx + b,其中 W 是权重矩阵,x 是输入,b 是偏置项,y 是输出。
  • 线性层的主要任务是将输入的数据通过权重和偏置进行线性变换,从而生成输出。

2. 正向传播

  • 正向传播(Forward Propagation)是神经网络计算输出的过程。
  • 它从输入层开始,通过各个隐藏层,最后到达输出层,每一层的输出都是下一层的输入。
  • 这个过程相当于逐层传递和处理信息。

3.反向传播

  • 反向传播是一种计算梯度的算法,用于神经网络的训练过程。
  • 它通过计算每个参数对损失函数的影响来更新网络的权重和偏置。
  • 具体来说,它是通过链式法则来计算损失函数相对于每个参数的梯度,然后使用这些梯度来更新参数。

 原文链接:https://blog.csdn.net/kljyrx/article/details/140269155 

4.优化器

 在深度学习中,优化器(optimizer)是一种用于调整神经网络模型参数以最小化损失函数的算法。优化器的目标是根据输入数据和期望的输出标签来调整模型的权重和偏置,使得模型能够更好地拟合训练数据并在未见过的数据上表现良好。 

 

我们下面在四中用到的优化器就是SGD(随机梯度下降)

(1)SGD(随机梯度下降) 

用于优化模型参数,通过更新参数以最小化损失函数。 

公式:θ = θ - learning_rate * ∇J(θ)

其中,θ表示模型参数,learning_rate表示学习率,∇J(θ)表示损失函数J关于θ的梯度。

用法:常用于深度学习中的优化过程,每次迭代更新参数时仅使用一个样本或一小批样本。

主要参数:learning_rate(学习率)

优点:易于实现和理解,适用于大规模数据集。

缺点:可能陷入局部最小值,参数更新的震荡。

其他的优化器可以参考下面这篇文章。
                        
原文链接:https://blog.csdn.net/AI_dataloads/article/details/133146550

二、利用顺序结构实现

  • 在每次迭代中,首先计算预测值y_predict
  • 然后计算损失函数,这里使用的是均方误差(MSE)。
  • 接下来,检查wb的梯度是否存在(虽然在这个例子中它们总是存在的,因为我们在循环之前设置了requires_grad=True),并清零梯度。这是因为在PyTorch中,梯度会累积,所以每次迭代前需要清零。
  • 调用loss.backward()来计算损失函数关于wb的梯度。
  • 最后,使用梯度下降法更新wb的值。
'''y=wx+b'''

import torch
import matplotlib.pyplot as plt

#利用pytorch顺序实现线性回归

#1.准备数据集,真实房产数据
x_data=torch.tensor([[0.18],[0.1],[0.16],[0.08],[0.09],[0.11],[0.12],[0.17],[0.15],[0.14],[0.13]])
y_data=torch.tensor([[0.18],[0.1],[0.16],[0.08],[0.09],[0.11],[0.12],[0.17],[0.15],[0.14],[0.13]])

#2.定义参数
w=torch.tensor([[10]],requires_grad=True,dtype=torch.float32)   
b=torch.tensor([0],requires_grad=True,dtype=torch.float32)        #w 和 b 是模型的参数,分别表示权重和偏置。它们被初始化为张量,并设置了requires_grad=True,这样PyTorch就可以自动计算它们的梯度。
learning_rate=0.5    #定义学习率
epoch=5000     #迭代次数,表示整个数据集将被遍历多少次来更新参数。

#3.(训练模型)通过循环迭代逼近w与b真实值,也就是更新w,b参数,导数通过反向传播求导得到
for i in range(epoch):
    y_predict=torch.matmul(x_data,w)+b     #正向传播
    loss=(y_data-y_predict).pow(2).mean()  #计算均方差/损失函数
    
#梯度清零,在PyTorch中,梯度会累积,所以每次迭代前需要清零。
    if w.grad is not None:
        w.grad.data.zero_()
    if b.grad is not None:
        b.grad.data.zero_()

    loss.backward()      #反向传播
    w.data=w.data-learning_rate*w.grad
    b.data=b.data-learning_rate*b.grad
    print("w,b,loss",w.item(),b.item(),loss.item(),i)

plt.figure()
plt.scatter(x_data,y_data,20,'r')
y_predict=torch.matmul(x_data,w)+b
plt.plot(x_data,y_predict.detach().numpy())
plt.show()

在PyTorch中,.pow() 是一个张量(Tensor)方法,用于对张量中的元素进行幂运算。当你调用 .pow(n) 时,它会将张量中的每个元素都提升到 n 次幂。不过,在大多数情况下,特别是在计算损失函数如均方误差(MSE)时,n 通常是一个标量值,比如2。

在PyTorch中,.mean() 是一个张量(Tensor)方法,用于计算张量中所有元素的平均值,或者如果指定了维度(dimension),则计算该维度上元素的平均值。 

y_true = torch.tensor([3.0, -0.5, 2.0, 7.0])
y_pred = torch.tensor([2.5, 0.0, 2.0, 8.0])
error = y_true - y_pred
mse_loss = error.pow(2).mean()
print(mse_loss)

                        

 三、封装类实现

import torch
import matplotlib.pyplot as plt

class LModel():
    def __init__(self,learning_rate):
        self.w=torch.tensor([[10]],requires_grad=True,dtype=torch.float32)
        self.b = torch.tensor([0], requires_grad=True, dtype=torch.float32)#self.w和self.b:分别初始化模型的权重和偏置。这里权重w初始化为[[10]],偏置b初始化为[0],都设置为需要梯度(requires_grad=True),以便进行反向传播。
        self.learning_rate=learning_rate   #设置学习率,用于梯度下降时的参数更新。
        self.loss=None   #用于存储每次前向传播计算的损失值。

    def forward(self,x,y):
        y_pred=torch.matmul(x,self.w)+self.b      #接收输入x和真实值y,计算预测值y_pred。
        self.loss=(y-y_pred).pow(2).mean()        #使用均方误差(MSE)作为损失函数,计算预测值和真实值之间的损失。
        return y_pred                            #返回预测值y_pred。


    def backward(self):
        if self.w.grad is not None:
            self.w.grad.data.zero_()
        if self.b.grad is not None:                  #如果权重w和偏置b的梯度已存在,则将其清零(避免梯度累加)。
            self.b.grad.data.zero_()
        self.loss.backward()        #调用self.loss.backward()计算损失函数对w和b的梯度。
        self.w.data=self.w.data-self.learning_rate*self.w.grad
        self.b.data = self.b.data - self.learning_rate * self.b.grad     #使用梯度下降更新权重w和偏置b的值。

        print("最终的:w,b,loss",self.w.item(),self.loss.item())

#准备数据
x_data=torch.tensor([[0.18],[0.1],[0.16],[0.08],[0.09],[0.11],[0.12],[0.17],[0.15],[0.14],[0.13]])
y_data=torch.tensor([[0.18],[0.1],[0.16],[0.08],[0.09],[0.11],[0.12],[0.17],[0.15],[0.14],[0.13]])

#训练模型
epoch=5000
model=LModel(learning_rate=0.5)    #实例化LModel类,并传入学习率0.5

for i in range(epoch):
    model.forward(x_data,y_data)
    model.backward()


plt.figure()
plt.scatter(x_data,y_data,20,"r")
y_predict=model.forward(x_data,y_data)
plt.plot(x_data,y_predict.detach().numpy())
plt.show()

 

 四、继承类实现

1.torch.nn.Linear

torch.nn.Linear,这是一个非常重要的线性层(也称为全连接层或密集层),它执行的是线性变换,其数学表达式为 y = xA^T + b,其中 x 是输入数据,A 是层的权重矩阵(在 PyTorch 中由 weight 参数表示),b 是偏置项(在 PyTorch 中由 bias 参数表示),y 是输出。 

torch.nn.Linear 层是神经网络中最基本的构建块之一,它通常用于从输入特征中提取线性关系。这个层在多层感知器(MLP)、循环神经网络(RNN)和卷积神经网络(CNN)中的全连接层等模型中都有广泛应用。

import torch
import torch.nn as nn

# 定义一个线性层,输入特征数为10,输出特征数为5
linear_layer = nn.Linear(in_features=10, out_features=5)

# 创建一个随机的输入张量,形状为 (batch_size, in_features)
# 这里我们假设 batch_size 为 3
input_tensor = torch.randn(3, 10)

# 通过线性层传递输入张量
output_tensor = linear_layer(input_tensor)

# 输出张量的形状为 (batch_size, out_features)
# 在这个例子中,形状应该是 (3, 5)
print(output_tensor.shape)

继承类实现代码 

import torch
import matplotlib.pyplot as plt

class LinearModel(torch.nn.Module):         #LinearModel类继承自torch.nn.Module,这是构建所有神经网络模型的基类。
    def __init__(self):
        super(LinearModel,self).__init__()       #在__init__方法中,通过super()调用父类的构造函数进行初始化
        self.Linear=torch.nn.Linear(1,1) #self.Linear定义了一个线性层(全连接层),输入特征数和输出特征数均为1。

    #正向传播/前向传播
    def forward(self,x):
        y_pred=self.Linear(x)   #输入x通过线性层self.Linear(或self.linear,如果按建议修改)得到预测值y_pred。
        return y_pred
#数据准备
x_data=torch.tensor([[0.18],[0.1],[0.16],[0.08],[0.09],[0.11],[0.12],[0.17],[0.15],[0.14],[0.13]])
y_data=torch.tensor([[0.18],[0.1],[0.16],[0.08],[0.09],[0.11],[0.12],[0.17],[0.15],[0.14],[0.13]])

#初始化模型、损失函数和优化器
model=LinearModel()
criterion=torch.nn.MSELoss(size_average=False)#在PyTorch的新版本中,size_average参数已被弃用,应使用reduction='sum'或reduction='mean'。
# 但由于y_data和y_pred的形状相同且为(11, 1),使用默认的reduction='mean'也是可行的,它会计算所有元素的平均损失。
optimizer=torch.optim.SGD(model.parameters(),lr=0.05)

for epoch in range(5000):
    y_pred=model(x_data)#在每次迭代中,通过模型得到预测值y_pred
    loss=criterion(y_pred,y_data)#计算损失函数
    optimizer.zero_grad()#清空梯度
    loss.backward()#反向传播计算梯度。
    optimizer.step()#更新模型参数。
    print(loss)

#打印线性层的权重和偏置项。
print('w=',model.Linear.weight.item())
print('b=',model.Linear.bias.item())   #item()方法用于从只包含一个元素的张量中提取其Python数值。

#测试模型
x_test=torch.tensor([[4.0]])
y_test=model(x_test)
print('y_pred=',y_test.data)

plt.figure()
plt.scatter(x_data,y_data,20,'r')
y_predict=model(x_data)
plt.plot(x_data,y_predict.detach().numpy())
plt.show()

 

 关于类,对象,继承的内容后续会在python学习中完善。

标签:tensor,grad,self,torch,pytorch,深度,线性,梯度,data
From: https://blog.csdn.net/2301_79712009/article/details/143633320

相关文章

  • 学术新趋势:深度融合迁移学习与多模态技术,推动模型性能极限突破
    2024深度学习发论文&模型涨点之——迁移学习+多模态迁移学习是指将一个领域或任务中获得的知识应用到另一个相关领域或任务中的方法。其主要优势在于可以减少对大量训练数据的需求,并提高模型在新任务上的性能。多模态学习是指在不同类型的数据(如图像、文本、音频等)之间共享知......
  • 每周算法2:数学+模拟+哈希表+栈+线性dp+贪心(简单)
    目录1.统计数字描述输入描述:输出描述: 题解2.两个数组的交集(哈希表)描述题解 3.点击消除(栈)描述输入描述:输出描述: 题解4.牛牛的快递(模拟+补充)描述输入描述:输出描述:题解 5.最小花费爬楼梯(简单线性dp)描述输入描述:输出描述:示例1题解6.数组中两......
  • 从0开始深度学习(27)——卷积神经网络(LeNet)
    1LeNet神经网络LeNet是最早的卷积神经网络之一,由YannLeCun等人在1990年代提出,并以其名字命名。最初,LeNet被设计用于手写数字识别,最著名的应用是在美国的邮政系统中识别手写邮政编码。LeNet架构的成功证明了卷积神经网络在解决实际问题中的有效性,为后续更复杂、更强大的CN......
  • 基于深度学习+pytorch+PyQt6+MySQL的口罩佩戴识别系统
    前言本系统是一个完整的基于深度学习+pytorch+PyQt6+MySQL的口罩佩戴识别系统。包括LeNet、AlexNet、VGG、GoogLeNet、ResNet、MobileNetV2网络模型。可以直接训练、测试、使用。也就是说,它不仅仅是一个口罩佩戴识别系统。它可以是任意识别系统!!系统演示视频登陆注册系......
  • 基于深度学习+pytorch+PyQt6+MySQL的农作物识别系统
    前言本系统是一个完整的基于深度学习+pytorch+PyQt6+MySQL的农作物识别系统。包括LeNet、AlexNet、VGG、GoogLeNet、ResNet、MobileNetV2网络模型。可以直接训练、测试、使用。也就是说,它不仅仅是一个农作物识别系统。它可以是任意识别系统!!系统演示视频登陆注册系统使......
  • 基于YOLOv8模型的安全背心目标检测系统(PyTorch+Pyside6+YOLOv8模型)
    摘要:基于YOLOv8模型的安全背心目标检测系统可用于日常生活中检测与定位安全背心目标,利用深度学习算法可实现图片、视频、摄像头等方式的目标检测,另外本系统还支持图片、视频等格式的结果可视化与结果导出。本系统采用YOLOv8目标检测算法训练数据集,使用Pysdie6库来搭建前端页面......
  • 基于YOLOv8模型和PCB电子线路板缺陷目标检测系统(PyTorch+Pyside6+YOLOv8模型)
    摘要:基于YOLOv8模型PCB电子线路板缺陷目标检测系统可用于日常生活中检测与定位PCB线路板瑕疵,利用深度学习算法可实现图片、视频、摄像头等方式的目标检测,另外本系统还支持图片、视频等格式的结果可视化与结果导出。本系统采用YOLOv8目标检测算法训练数据集,使用Pysdie6库来搭建......
  • 深度学习工程实践:PyTorch Lightning与Ignite框架的技术特性对比分析
    在深度学习框架的选择上,PyTorchLightning和Ignite代表了两种不同的技术路线。本文将从技术实现的角度,深入分析这两个框架在实际应用中的差异,为开发者提供客观的技术参考。核心技术差异PyTorchLightning和Ignite在架构设计上采用了不同的方法论。Lightning通过提供高层次的抽象......
  • 计算机毕业设计Python+大模型农产品价格预测 ARIMA自回归模型 农产品可视化 农产品爬
    作者简介:Java领域优质创作者、CSDN博客专家、CSDN内容合伙人、掘金特邀作者、阿里云博客专家、51CTO特邀作者、多年架构师设计经验、多年校企合作经验,被多个学校常年聘为校外企业导师,指导学生毕业设计并参与学生毕业答辩指导,有较为丰富的相关经验。期待与各位高校教师、企业......
  • 深度学习Pytorch快速入门我是土堆,P14torchvision中的数据集使用
    这里先表明下为啥从P8直接跳到了P14,原因是这中间的讲的都是Transfroms的使用,作为小白我听完课之后总结下Transfrom的功能:1.输入2.输出3.改变图片的大小。而且老师说了这个用的比较多,所以想先往下看,等到后面用到的时候,up还会再讲的。importtorchvisionfromtorch.utils.tenso......