pytorch线性/非线性回归拟合

news2024/9/30 20:06:52

一、线性回归

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. 查看拟合结果 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2180587.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

《向量数据库指南》——Fivetran 的 Partner SDK:构建自定义连接器和目标

哈哈,说到 Fivetran 的 Partner SDK,这可真是个好东西啊!作为向量数据库领域的“老司机”,我今天就来给大家详细讲讲这个 SDK 的厉害之处,以及如何用它来构建自定义连接器和目标,实现与 Fivetran 自动化数据移动平台的无缝集成。 一、Fivetran Partner SDK:开启自定义连…

二叉树深搜专题篇

目录 计算布尔二叉树的值 求根节点到叶节点数字之和 二叉树剪枝 验证二叉搜索树 二叉搜索树中第K小的元素 二叉树的所有路径 计算布尔二叉树的值 题目 思路 这道题其实是比较简单的,对二叉树来一次后序遍历即可,当遇到叶子结点直接返回叶子节点中…

干部画像系统怎么实现人岗智能匹配的?

人岗匹配的核心在于实现“岗得其人”和“人适其岗”,即根据不同人的个体特征将不同的人安排在各自最合适的岗位上,达到人尽其才的目标。干部画像系统作为一种辅助领导智慧识才的工具,通过集成多种技术手段和分析方法,对干部的定性…

【代码实现】torch实现F.pixel_shuffle和F.pixel_unshuffle

原理 pixel_shuffle 和 pixel_unshuffle 常用于神经网络减少特征图尺寸以减少计算量,由于有些硬件不支持这两个算子,可以根据原理使用torch实现。 代码实现 import torch.nn.functional as F import torch def pixelshuffle_inv(tensor, scale2):N, c…

C++详解vector

目录 构造和拷贝构造 赋值运算符重载: vector的编辑函数: assign函数: push_back和pop_back函数: insert函数: erase函数: swap函数: clear函数: begin函数: e…

【以图搜图代码实现2】--faiss工具实现犬类以图搜图

第一篇:【以图搜图代码实现】–犬类以图搜图示例 使用保存成h5文件,使用向量积来度量相似性,实现了以图搜图,说明了可以优化的点。 第二篇:【使用resnet18训练自己的数据集】 准对模型问题进行了优化,取得了…

汽修行业的知识库搭建:赋能在线教育与知识付费

随着汽修行业的蓬勃发展,其业务范围和技术要求日益多元化。为了应对这一趋势,许多汽修公司开始探索线上教育模式,通过开设汽修知识课程,实现知识的有偿分享与传播。这一转变不仅拓宽了企业的盈利渠道,也为广大汽修爱好…

深度学习之贝叶斯分类器

贝叶斯分类器 1 图解极大似然估计 极大似然估计的原理,用一张图片来说明,如下图所示: ​ 例:有两个外形完全相同的箱子,1号箱有99只白球,1只黑球;2号箱有1只白球,99只黑球。在一次…

【Spark 实战】基于spark3.4.2+iceberg1.6.1搭建本地调试环境

基于spark3.4.2iceberg1.6.1搭建本地调试环境 文章目录 基于spark3.4.2iceberg1.6.1搭建本地调试环境环境准备使用maven构建sparksql编辑SparkSQL简单任务附录A iceberg术语参考 环境准备 IntelliJ IDEA 2024.1.2 (Ultimate Edition)JDK 1.8Spark 3.4.2Iceberg 1.6.1 使用mave…

C++----类和对象(一)

一.类的定义 1.类定义的格式 • class为定义类的关键字,ST为类的名字,{}中为类的主体,注意类定义结束时后面分号不能省 略。类体中内容称为类的成员:类中的变量称为类的属性或成员变量; 类中的函数称为类的方法或 者成员函数。 …

NAND Flash虚拟层设计概述

NAND Flash虚拟层的建立需要对NAND Flash虚拟层进行初始化,根据相应的NAND Flash的物理结构参数建立逻辑结构,并建立索引表来管理逻辑虚拟层与物理虚拟层之间的联系;而在NAND Flash虚拟层运行过程中需要对NAND Flash虚拟层进行相应的垃圾回收…

【AI驱动TDSQL-C Serverless数据库技术实战】 AI电商数据分析系统——探索Text2SQL下AI驱动代码进行实际业务

目录 一、Text2SQL简介二、基于TDSQL-C Serverless的Text2SQL实战2.1、程序流程图2.2、实践流程2.2.1、配置TDSQL-C2.2.2、部署LLAMA模型2.2.3、本地依赖安装2.2.4、应用构建 2.3、运行效果 三、Text2SQL下的AI驱动 Text2SQL 是一种将自然语言查询转换为 SQL 查询的技术&#x…

NVIDIA H200 Tensor Core GPU

增强 AI 和 HPC 工作负载。 文章目录 前言一、通过更大、更快的内存实现更高的性能二、通过高性能 LLM三、增强高性能计算四、Reduce Energy and TCO 降低能耗和 TCO五、通过 H200 NVL 为主流企业服务器释放 AI 加速前言 The GPU for Generative AI and HPC 用于生成式 AI 和 …

香港科技大学新作:速度场如何在复杂城市场景规划中大显身手

导读: 本篇文章提出了一种局部地图表示方法(即速度场)来解决无法为所有场景设计通用规划规则的问题。此外,本文开发了一种高效的迭代轨迹优化器,其与速度场无缝兼容,实现了训练和推理过程。实验结果表明&am…

Linux操作系统中Redis

1、什么是Redis Redis(Remote Dictionary Server ),即远程字典服务,是一个开源的使用ANSIC语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。 可以理解成一个大容量的map。…

《向量数据库指南》——Milvus 和 Fivetran 如何为 AI 构建基础

哈哈,说起 Milvus 和 Fivetran 如何为 AI 构建基础,这可真是个有意思的话题!来,让我这个向量数据库领域的“老司机”给你详细讲解一番,保证让你听得津津有味,还能学到不少干货! Milvus 和 Fivetran:AI 搜索解决方案的黄金搭档 在当今这个数据爆炸的时代,AI 已经成为…

《软件工程概论》作业一:新冠疫情下软件产品设计(小区电梯实体按钮的软件替代方案)

课程说明:《软件工程概论》为浙江科技学院2018级软件工程专业在大二下学期开设的必修课。课程使用《软件工程导论(第6版)》(张海藩等编著,清华大学出版社)作为教材。以《软件设计文档国家标准GBT8567-2006》…

net core mvc 数据绑定 《2》 bind fromquery,FromRoute,fromform等,自定义模型绑定器

mvc core 模型绑定 控制绑定名称 》》》Bind 属性可以用来指定 模型应该 绑定的前缀 public class MyController : Controller {[HttpPost]public ActionResult Create([Bind(Prefix "MyModel")] Ilist<MyModel> model){// 模型绑定将尝试从请求的表单数据中…

Vue2实现主内容滚动到指定位置时,侧边导航栏也跟随选中变化

需求背景&#xff1a; PC端项目需要实现一个有侧边导航栏&#xff0c;可点击跳转至对应内容区域&#xff0c;类似锚点导航&#xff0c; 同时主内容区域上下滚动时&#xff0c;可实现左侧导航栏选中样式能实时跟随变动的效果。 了解了一下&#xff0c;Element Plus 组件库 和 …

从源码中学习动态代理模式

动态代理模式 动态代理是 Java 反射&#xff08;Reflection&#xff09;API 提供的一种强大机制&#xff0c;它允许在运行时创建对象的代理实例&#xff0c;而不需要在编译时静态地创建。 Java 提供了两种主要的方式来实现动态代理&#xff1a; 基于接口的动态代理&#xff1a…