首页 > 其他分享 >pytorch线性/非线性回归拟合

pytorch线性/非线性回归拟合

时间:2024-09-30 16:18:43浏览次数:11  
标签:loss torch nn self 非线性 pytorch 拟合 model data

一、线性回归

1. 导入依赖库

import numpy as np
import matplotlib.pyplot as plt
import torch
from torch import nn, optim
from torch.autograd import Variable
  • numpy:用来构建数据
  • matplotlib.pyplot: 将构建好的数据可视化
  • torch.nn:包含了torch已经准备好的层,激活函数、全连接层等
  • torch.optim:提供了神经网络的一系列优化算法,如 SGD、Adam 等
  • torch.autograd:用来自动求导,计算梯度。其中Variable用来包装张量,使得张量能够支持自动求导,但在 PyTorch 0.4 及以后,已经被 Tensor 对象取代。

2. 构建数据

        首先确定一个线性函数,例如y_data = 0.1 * x_data + 0.2。然后在这条直线上加一些噪点,最后看神经网络是否能抵抗这些干扰点,拟合出正确的线性函数。

        只要做神经网络相关的数据处理,就一定要把数据转为张量(tensor)类型。然后想要实现梯度下降算法,就要把张量类型再转为Variable类型。

x_data = np.random.rand(100)
noise = np.random.normal(0, 0.01, x_data.shape)  # 构建正态分布噪点
y_data = x_data * 0.1 + 0.2 + noise

x_data = x_data.reshape(-1, 1)  # 把原始数据更改形状,自动匹配任意行,1列
y_data = y_data.reshape(-1, 1)

x_data = torch.FloatTensor(x_data)  # 把numpy类型转为tensor类型
y_data = torch.FloatTensor(y_data)
inputs = Variable(x_data)  # 变成variable类型才可以自动求导操作
target = Variable(y_data)

 3. 构建神经网络模型

        构建神经网络模型通常遵循一个相对固定的模板。这种模板不仅让代码结构清晰,还能利用 PyTorch 提供的模块化设计,使得网络的定义、训练、推理更加简洁。

        这里我们定义一个一对一的全连接层即可。使用MSE代价函数,SGD优化算法。

class LinearRegression(nn.Module):
    # 定义网络结构
    def __init__(self):
        super(LinearRegression, self).__init__()  # 固定写法,初始化父类
        self.fc = nn.Linear(1, 1)  # 定义一个全连接层,且一对一

    # 定义网络计算(前向传播)
    def forward(self, x):
        out = self.fc(x)  # 将输入传递给全连接层
        return out


model = LinearRegression()  # 定义模型
mse_loss = nn.MSELoss()  # 使用均方差代价函数
optimizer = optim.SGD(model.parameters(), lr=0.1)  # 使用随机梯度下降法优化模型

4. 模型训练

         在模型训练上,几乎也是一个固定套路。之前写的,inputs和target即x_data和y_data的Variable类型。那么当模型(model)获得输入值(inputs),通过前向传播(forward)就会获得一个输出值(out)。然后通过MSE代价函数就能计算出损失(loss),最后经过计算梯度,优化权值,就完成了一轮训练。共训练1000次,期间可以每隔200次看一下损失值。通过输出结果可以看到loss值在一直变小,训练还不错!

for i in range(1001):
    out = model(inputs)
    loss = mse_loss(out, target)  # 计算损失
    optimizer.zero_grad()  # 梯度清0
    loss.backward()  # 计算梯度
    optimizer.step()  # 优化权值
    if i % 200 == 0:
        print('第{}次,loss值为:{}'.format(i, loss.item()))

        如果我们查看看最后拟合后的权重值(weight)和偏置值(bias),可以发现和我们之前设计好的的 y_data = 0.1 * x_data + 0.2 几乎非常吻合。

for name, param in model.named_parameters():
    print('name:{}\nparam:{}\n'.format(name, param))

5. 绘图查看结果

         首先利用scatter画出散点图,然后用plot绘出神经网络的拟合结果。

y_pred = model(inputs)
plt.scatter(x_data, y_data)
plt.plot(x_data, y_pred.data.numpy(), color='red')
plt.show()

二、非线性回归

         构建非线性回归时,思路和线性回归几乎一致,只需要把数据改为非线性数据,然后神经网络模型增加一个隐藏层即可。    

1. 构建非线性数据 

        首先事先设计一个非线性函数:y_data = x_data²,然后再加入一些噪点干扰神经网络。

x_data = np.linspace(-2, 2, 200)[:, np.newaxis]  # linspace(起始点,终止点,分割点总数),然后增加维度到(200, 1)
noise = np.random.normal(0, 0.2, x_data.shape)
y_data = np.square(x_data) + noise

2. 修改神经网络模型 

         一般情况下,只有隐藏层使用激活函数才可用来拟合非线性数据,如sigmoid、relu、tanh等。这里可以先确定10个隐藏神经元看效果如何。

class NonLinearRegression(nn.Module):
    # 定义网络结构
    def __init__(self):
        super(NonLinearRegression, self).__init__()  # 固定写法,初始化父类
        self.fc1 = nn.Linear(1, 10)  #   定义隐藏层,10个隐藏神经元
        self.tanh = nn.Tanh()  # 激活函数
        self.fc2 = nn.Linear(10, 1)

    # 定义网络计算(前向传播)
    def forward(self, x):
        x = self.fc1(x)
        x = self.tanh(x)
        x = self.fc2(x)
        return x

        如果想要较短时间的训练来获取一个相对较好的结果,可以尝试 Adam 自适应矩阵优化算法。虽然 Adam 算法可以自动调整学习率,但是一般默认初始值是0.001,最后训练情况不理想,所以这里设置为0.05的初始值。而且这个算法容易过拟合,需要正则化 weight_decay 来提高模型的泛化性。

        注意:这里的代价函数不可以修改为交叉熵(CrossEntropyLoss),因为交叉熵大多用于分类任务。

model = NonLinearRegression()
mse_loss = nn.MSELoss()  # 均方差代价函数
optimizer = optim.Adam(model.parameters(), lr=0.05, weight_decay=0.001)  # 设置L2正则化,防止过拟合

3. 查看拟合结果 

标签:loss,torch,nn,self,非线性,pytorch,拟合,model,data
From: https://blog.csdn.net/weixin_51418964/article/details/142654149

相关文章

  • 基于卷积神经网络的宠物皮肤病识别系统,resnet50,mobilenet模型【pytorch框架+python】
       更多目标检测和图像分类识别项目可看我主页其他文章功能演示:基于卷积神经网络的宠物皮肤病识别系统,resnet50,mobilenet【pytorch框架,python,tkinter】_哔哩哔哩_bilibili(一)简介基于卷积神经网络的宠物皮肤病识别系统是在pytorch框架下实现的,这是一个完整的项目,包括代码......
  • 【PyTorch】环境配置
    Window11+RTX4060配置CUDA11.8+pytorch2.0.0下载CUDA11.8进入官网下载Link,然后点击ArchiveofPreviousCUDAReleases,找到对应版本11.8。选择对应操作系统版本,点Download下载到本地。下载cuDNN点击链接Link,找到CUDA11.8对应的cuDNN。安装CUDA11.8全程点击next直......
  • Pytorch学习笔记--搭建神经网络以及Sequential的使用
    首先,搭建一个如下图所示的神经网络: 分析图片,inputs输入图片的inchannels=3,尺寸是32*32,经过kernel_size=5的卷积操作后out_channels=32,尺寸32*32,套用下方公式可算出padding=2(默认dilation=1,stride=1):self.conv1=Conv2d(3,32,5,padding=2)  之后再进行池化操作Max-poolin......
  • 从Anaconda到PyTorch到训练Yolo——Windows系统
    1、Anacondaconda能管理不同的开发编译环境,互补干涉影响。Anaconda和Miniconda是conda的工具,前者带界面(大而全),后者只有命令行窗口(小而精)。作为初学,建议安装Anaconda1.1安装Anaconda下载 DownloadAnacondaDistribution|Anaconda ,安装到D盘,其他默认。 1.2更换源 ......
  • 过拟合与欠拟合
    过拟合(Overfitting)与欠拟合(Underfitting)是机器学习和深度学习模型中常见的两个问题,分别对应模型过于复杂和模型过于简单的情况。它们会影响模型的泛化能力和预测效果。过拟合(Overfitting)过拟合是指模型在训练数据上表现得非常好,但在新数据(测试集或验证集)上表现较差,即模型过度拟......
  • 调用YOLOv8所需的pytorch环境配置
    第一步:创建conda虚拟环境(切记不要“科学上网”)依赖库的要求Python>=3.8,PyTorch>=1.8.1.创建虚拟环境后,首先安装了python=3.10:condainstallpython==3.10 2.运行pipinstallultralyticsPyTorch>=1.83.卸载由于第二步直接安装的组件pip3uninstalltorchtorchvision......
  • 基于yolov10的学生课堂行为检测系统,支持图像、视频和摄像实时检测【pytorch框架、pyth
    更多目标检测和图像分类识别项目可看我主页其他文章功能演示:基于yolov10的学生课堂行为检测系统,支持图像、视频和摄像实时检测【pytorch框架、python】_哔哩哔哩_bilibili(一)简介基于yolov10的学生课堂行为检测系统是在pytorch框架下实现的,这是一个完整的项目,包括代码,数据集......
  • Pytorch - Install
    https://pytorch.org/get-started/locally/  zzh@ZZHPC:~/zd/Github$python-mvenvzpytorchzzh@ZZHPC:~/zd/Github$cdzpytorch/zzh@ZZHPC:~/zd/Github/zpytorch$sourcebin/activate(zpytorch)zzh@ZZHPC:~/zd/Github/zpytorch$command-vpython/zdata/Git......
  • 【赛博炼丹】深度学习软件安装及环境配置:Anaconda、CUDA、cuDNN、PyTorch及PyCharm
    前言建议大伙自己建一个文件夹(不能有中文),专门放深度学习的软件,后续添加环境,比较方便。1.安装Anaconda1.1下载AnacondaAnaconda官网:https://www.anaconda.com清华大学镜像网站:Indexof/anaconda/archive/|清华大学开源软件镜像站|TsinghuaOpenSourceMirror安装A......
  • Python实现:时间序列趋势外推法应用-龚珀兹曲线拟合
    龚珀兹曲线下表数据为某跨国公司1989-2021年的年销售量数据,使用适合的模型预测该公司2022年的销售额,并得出理由。部分数据如下表(具体数据从主页资源下载):年份时序(t)总额(yt)时序应该从0开始19891138.40019902174.00119913190.55219924196.10319935230.50419946237.10519957274.......