人工智能-深度学习-Torch框架-手动构建回归流程

from sklearn.datasets import make_regression
import math
import random
import torch
  • from sklearn.datasets import make_regression: 导入make_regression函数,用于生成回归数据集。

  • import math: 导入math模块,用于进行数学计算,例如向上取整。

  • import random: 导入random模块,用于随机打乱数据集。

  • import torch: 导入torch库,用于张量操作和神经网络训练。

构建数据集

def build_data():'''构建数据集'''noise = 14.6#噪声n_sample = 1000#样本数量X,y,coef = make_regression(n_samples=n_sample,n_features=4,coef=True)X = torch.tensor(X,dtype=torch.float64,requires_grad=True)y = torch.tensor(y,dtype=torch.float64,requires_grad=True)return X,y,coef
  • def build_data():: 定义一个名为build_data的函数,用于构建数据集。

  • noise = 14.6: 设置噪声水平为14.6,用于生成带有噪声的数据。

  • n_sample = 1000: 设置样本数量为1000,用于生成1000个样本。

  • X, y, coef = make_regression(n_samples=n_sample, n_features=4, coef=True): 使用make_regression生成回归数据集,包含1000个样本和4个特征,并返回真实系数。

  • X = torch.tensor(X, dtype=torch.float64, requires_grad=True): 将生成的特征矩阵X转换为PyTorch张量,数据类型为torch.float64,并设置requires_grad=True以启用梯度计算。

  • y = torch.tensor(y, dtype=torch.float64, requires_grad=True): 将生成的目标向量y转换为PyTorch张量,数据类型为torch.float64,并设置requires_grad=True以启用梯度计算。

  • return X, y, coef: 返回特征矩阵X、目标向量y和真实系数coef

构建数据加载器

def data_loader(x,y):'''数据加载器'''#配置参数batch_size = 16#一个批次的数量n_sample = x.shape[0]#len(x)长度n_batches = math.ceil(n_sample/batch_size)#一轮的训练次数index = [i for i in range(n_sample)]random.shuffle(index)for i in range(0,n_batches):indexs = index[i*batch_size:min((i+1)*batch_size,n_sample)]yield x[indexs],y[indexs]
  • def data_loader(x, y):: 定义一个名为data_loader的函数,用于加载数据。

  • batch_size = 16: 设置每个批次的样本数量为16,用于控制每次训练的样本数量。

  • n_sample = x.shape[0]: 获取样本数量,用于计算批次数量。

  • n_batches = math.ceil(n_sample / batch_size): 计算每轮的批次数量,使用math.ceil向上取整,确保所有样本都能被处理。

  • index = [i for i in range(n_sample)]: 创建一个包含所有样本索引的列表,用于随机打乱样本顺序。

  • random.shuffle(index): 打乱样本索引,以随机化样本顺序,避免训练过程中的顺序偏差。

  • for i in range(0, n_batches):: 遍历每个批次,确保每个批次都能被处理。

  • indexs = index[i * batch_size:min((i + 1) * batch_size, n_sample)]: 获取当前批次的索引,确保最后一个批次也能被处理。

  • yield x[indexs], y[indexs]: 返回当前批次的特征矩阵和目标向量,使用yield生成一个生成器,用于按需加载数据。

构建模型函数

def myregreser(x,w,b):return x@w+b#一个容器中装着的是每一条样本数据的预测值

x@w+b  跟  y = x*w+b差不多,无需多言哈

  • def myregreser(x, w, b):: 定义一个名为myregreser的函数,用于计算线性回归模型的预测值。

  • return x @ w + b: 返回预测值,使用矩阵乘法@计算xw的乘积,然后加上偏置b,实现线性回归模型.

构建损失函数

def MSE(y_pred,y_true):return torch.mean((y_pred-y_true)**2)
  • def MSE(y_pred, y_true):: 定义一个名为MSE的函数,用于计算均方误差(MSE)损失。

  • return torch.mean((y_pred - y_true) ** 2): 返回预测值和真实值之间的均方误差,用于衡量模型的预测精度。

把参数初始化

def  initialize(n_featrue):torch.manual_seed(666)w = torch.randn(n_featrue,requires_grad=True,dtype=torch.float64)# print(w)b = torch.tensor(14.5,requires_grad=True,dtype=torch.float64)return w,b
  • def initialize(n_feature):: 定义一个名为initialize的函数,用于初始化模型参数。

  • torch.manual_seed(666): 设置随机种子为666,以确保结果可重复,避免随机性带来的不确定性。

  • w = torch.randn(n_feature): 使用随机值初始化权重w,确保模型初始状态具有一定的随机性。

  • b = torch.tensor(14.5, requires_grad=True, dtype=torch.float64): 初始化偏置b,并设置requires_grad=True以启用梯度计算,确保偏置可以被优化。

  • return w, b: 返回初始化的权重和偏置。

构建梯度下降函数

def optim_step(w,b,dw,db,lr):
#更新梯度,朝着梯度下降的方向去更新梯度w.data = w.data-lr*dw.datab.data = b,data-lr*db.data
  • def optim_step(w, b, dw, db, lr):: 定义一个名为optim_step的函数,用于更新模型参数。

  • w.data = w.data - lr * dw.data: 更新权重w,沿着梯度下降的方向,使用学习率lr控制更新的步长。

  • b.data = b.data - lr * db.data: 更新偏置b,沿着梯度下降的方向,使用学习率lr控制更新的步长。

使用上面构建的函数进行实战训练

def train():#生成数据x,y,coef = build_data()#初始化参数w,b = initialize(x.shape[1])#定义训练参数lr = 0.01epoch = 100for i in range(epoch):loss_e = 0count = 0for batch_x,batch_y_true in data_loader(x,y):y_bacth_pred = myregreser(batch_x,w,b)loss = MSE(y_bacth_pred,batch_y_true)loss_e+=losscount+=1#梯度清零if w.grad is not None:w.data.zero_()if b.grad is not None:b.data.zero_()#反向传播(梯度计算)loss.backward()#梯度更行optim_step(w,b,w.grad,b.grad,lr)print(f'epoch:{i},loss:{loss_e/count}')return w,b,coef
if __name__=='__main__':w,b,coef = train()print(w,b)print(coef)print(torch.allclose(w,torch.tensor(coef)))
  • def train():: 定义一个名为train的函数,用于训练模型。

  • x, y, coef = build_data(): 生成数据集,获取特征矩阵x、目标向量y和真实系数coef

  • w, b = initialize(x.shape[1]): 初始化模型参数,获取初始化的权重w和偏置b

  • lr = 0.01: 设置学习率为0.01,控制参数更新的步长。

  • epoch = 100: 设置训练轮数为100,控制训练的迭代次数。

  • for i in range(epoch):: 外层循环,遍历每个训练轮,确保模型在多个轮次中进行训练。

  • loss_e = 0: 初始化每轮的总损失为0,用于累加每个批次的损失。

  • count = 0: 初始化批次计数为0,用于计算每轮的平均损失。

  • for batch_x, batch_y_true in data_loader(x, y):: 内层循环,遍历每个批次的数据,确保每个批次都能被处理。

  • y_batch_pred = myregreser(batch_x, w, b): 计算预测值,使用当前的权重和偏置进行预测。

  • loss = MSE(y_batch_pred, batch_y_true): 计算损失,使用均方误差衡量预测值和真实值之间的差异。

  • loss_e += loss: 累加损失,用于计算每轮的总损失。

  • count += 1: 计数批次数量,用于计算每轮的平均损失。

  • if w.grad is not None:: 检查权重w的梯度是否存在,确保梯度已经计算。

  • w.grad.zero_(): 清零权重w的梯度,避免梯度累积。

  • if b.grad is not None:: 检查偏置b的梯度是否存在,确保梯度已经计算。

  • b.grad.zero_(): 清零偏置b的梯度,避免梯度累积。

  • loss.backward(): 反向传播,计算梯度,用于更新模型参数。

  • optim_step(w, b, w.grad, b.grad, lr): 更新参数,沿着梯度下降的方向更新权重和偏置。

  • print(f'epoch:{i}, loss:{loss_e / count}'): 打印每轮的平均损失,用于监控训练过程。

  • return w, b, coef: 返回训练后的权重、偏置和真实系数,用于评估模型性能。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java全栈day10--后端Web基础(基础知识)之续集

一、Servlet执行流程 二、Http协议(相对Tomcat和servlet重要一点) 2.1Http-概叙 2.2Http-请求协议 2.2.3请求数据格式 2.2.3请求数据获取 先启动服务器 访问/hello Servlet 访问浏览器端Http协议数据 查看数据

web安全之信息收集

在信息收集中,最主要是就是收集服务器的配置信息和网站的敏感信息,其中包括域名及子域名信息,目标网站系统,CMS指纹,目标网站真实IP,开放端口等。换句话说,只要是与目标网站相关的信息,我们都应该去尽量搜集。 1.1收集域名信息 知道目标的域名之后,获取域名的注册信…

基于YOLOv8深度学习的智慧农业棉花采摘状态检测与语音提醒系统(PyQt5界面+数据集+训练代码)

智慧农业在现代农业中的应用日益广泛,其核心目标是通过智能化手段实现农业生产的自动化、精准化和高效化,而精准采摘技术作为智慧农业的重要组成部分,正受到越来越多的关注。棉花作为一种经济作物,其采摘过程传统上依赖于人工劳作…

使用vcpkg自动链接tinyxml2时莫名链接其他库(例如boost)

使用vcpkg自动链接tinyxml2时莫名链接其他库(例如boost) vcpkg的自动链接功能非常方便,但在某些情况下会出现过度链接的问题。 链接错误症状 以tinyxml2为例,程序中调用tinyxml2的函数后,若vcpkg中同时存在opencv和…

gitlab自动打包python项目

现在新版的gitlab可以不用自己配置runner什么的了 直接写.gitlab-ci.yml文件就行,这里给出一个简单的依靠setup把python项目打包成whl文件的方法 首先写.gitlab-ci.yml文件,放到项目根目录里 stages: # List of stages for jobs, and their or…

蓝桥杯每日真题 - 第24天

题目:(货物摆放) 题目描述(12届 C&C B组D题) 解题思路: 这道题的核心是求因数以及枚举验证。具体步骤如下: 因数分解: 通过逐一尝试小于等于的数,找到 n 的所有因数…

YOLOv10改进,YOLOv10添加TransNeXt中的ConvolutionalGLU模块,CVPR2024,二次创新C2f结构

摘要 由于残差连接中的深度退化效应,许多依赖堆叠层进行信息交换的高效视觉Transformer模型往往无法形成足够的信息混合,导致视觉感知不自然。为了解决这个问题,作者提出了一种聚合注意力(Aggregated Attention),这是一种基于仿生设计的token混合器,模拟了生物的中央凹…

(微信小程序)基于Spring Boot的校园失物招领平台的设计与实现(vue3+uniapp+mysql)

💗博主介绍💗:✌在职Java研发工程师、专注于程序设计、源码分享、技术交流、专注于Java技术领域和毕业设计✌ 温馨提示:文末有 CSDN 平台官方提供的老师 Wechat / QQ 名片 :) Java精品实战案例《700套》 2025最新毕业设计选题推荐…

快速排序hoare版本和挖坑法(代码注释版)

hoare版本 #define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h>// 交换函数 void Swap(int* p1, int* p2) {int tmp *p1;*p1 *p2;*p2 tmp; }// 打印数组 void _printf(int* a, int n) {for (int i 0; i < n; i) {printf("%d ", a[i]);}printf("…

C++ 【异步日志模块和std::cout << 一样使用习惯替代性好】 使用示例,后续加上远程日志

简单 易用 使用示例 CLogSystem::Instance().SetLogLevel( E_LOG_LEVEL::LOG_LEVEL_INFO | E_LOG_LEVEL::LOG_LEVEL_DEBUG | E_LOG_LEVEL::LOG_LEVEL_DUMP );CLogSystem::Instance().SetFileInfo(true, "./log.txt");LogDebug() << 12;LogInfo() << &qu…

LINUX c++环境

安装docker 拉取code-server镜像 1.安装GCC&#xff0c;GDB yum -y install gcc yum -y install gcc-c yum install gdb 创建文件夹和文件 linux下C开发_linux c-CSDN博客 第一步:预处理&#xff1a;将源代码的.c 、.cpp 、.h 等文件包含到一个文件中&#xff0c;预处理结…

【论文阅读】 Learning to Upsample by Learning to Sample

论文结构目录 一、之前的上采样器二、DySample概述三、不同上采样器比较四、整体架构五、设计过程&#xff08;1&#xff09;初步设计&#xff08;2&#xff09;第一次修改&#xff08;3&#xff09;第二次修改&#xff08;4&#xff09;第三次修改 六、DySample四种变体七、复…

源码安装triton 及出错处理,跟最简应用示例 01 vectorAdd 验证

-1, 源码安装 triton出错信息 WARNING: The user site-packages directory is disabled. error: cant create or remove files in install directory The following error occurred while trying to add or remove files in the installation…

EC2还原快照

EC2还原快照 AWS EC2 磁盘快照 是您 Amazon Elastic Block Store (EBS) 卷在特定时间点的增量备份。您可以使用快照创建 EBS 卷的副本&#xff0c;以便在出现故障时恢复数据或将数据迁移到其他区域。 创建磁盘快照 找到ec2实例挂载的磁盘&#xff0c;直接选择创建快照 等待创建…

提升数据分析效率:Excel Power Query和Power Pivot的妙用

在日常工作中&#xff0c;微软的Excel Power Query和Power Pivot是提升数据处理和分析效率的利器。他们的特点也各不相同&#xff0c;Power Query侧重数据的高效导入与清洗&#xff0c;Power Pivot更测试数据建模与复杂计算。下面将介绍它们各自的功能&#xff0c;并提供应用案…

优先算法 —— 双指针系列 - 快乐数

1. 快乐数 题目链接&#xff1a; 202. 快乐数 - 力扣&#xff08;LeetCode&#xff09;https://leetcode.cn/problems/happy-number/description/ 2. 题目解析 示例1&#xff1a; 示例2&#xff1a; 3. 算法原理 两种情况&#xff1a;我们可以把两种情况都看作为循环&#xff0…

【C++打怪之路Lv16】-- map set

&#x1f308; 个人主页&#xff1a;白子寰 &#x1f525; 分类专栏&#xff1a;重生之我在学Linux&#xff0c;C打怪之路&#xff0c;python从入门到精通&#xff0c;数据结构&#xff0c;C语言&#xff0c;C语言题集&#x1f448; 希望得到您的订阅和支持~ &#x1f4a1; 坚持…

AD7606使用方法

AD7606是一款8通道最高16位200ksps的AD采样芯片。5V单模拟电源供电&#xff0c;真双极性模拟输入可以选择10 V&#xff0c;5 V两种量程。支持串口与并口两种读取方式。 硬件连接方式&#xff1a; 配置引脚 引脚功能 详细说明 OS2 OS1 OS2 过采样率配置 000 1倍过采样率 …

利用Python爬虫获取1688商品类目:技术解析

在电商领域&#xff0c;数据的获取和分析对于市场趋势的把握至关重要。1688作为中国领先的B2B电商平台&#xff0c;其商品类目的数据对于商家来说具有极高的价值。本文将详细介绍如何使用Python编写爬虫程序&#xff0c;以合法合规的方式获取1688商品类目信息。 Python爬虫技术…

全文单词统计

目标&#xff1a;统计词频 import scala.io.Source //知识点 //1.字符串.split("分隔符")&#xff1a;把字符串用指定的分隔符。拆分成多份&#xff0c;保存在数组中 object test1 {def main(args: Array[String]): Unit { //从文件1.txt中读入内容val contentSourc…