深度学习--从零实现线性回归【数据流水线+模型+损失函数+小批量梯度下降】

news2024/11/13 16:17:11

代码来源于动手学深度学习pytorch版,感兴趣的同学可以自行购买观看。本节内容带着大家了解深度学习框架底层实现逻辑,如何自定义模型,自定义层或自定义损失函数,方便大家后续使用深度学习框架时候能够明白一些基本函数的实现过程,让我们知道每一步在做什么,更好的调试我们的代码。

一、前言 

为了展示每个代码块的输出,本文在jupyter notebook编译环境进行编写代码,还不知道怎么配置的友子们可以看看前面的帖子。配置完成后可以跟着一起操作,本文附带源码。

二、代码实现及解释

实现线性回归,首先需要创建一个数据集,为了简单起见,我们根据一个带噪声的线性模型构造一个数据集。在下面的实验中我们生成了一个包含1000个样本的数据集,每个样本包含从标准正态分布中抽样的两个特征。我们的合成数据集是一个矩阵  X\epsilon \mathbb{R}^{1000*2}

线性模型如下:

y=Xw+b+\epsilon

模型参数  w=[-2,-3.4]^{T},将行向量转置为列向量方便与X向量对应相乘,b = 4.2,\epsilon表示预测值与真实值的偏差,模拟真实情况。这里模型参数都是预先假设,可以设置为其他数字。

假设\epsilon服从均值为0,标准差为0.01的正态分布,下面代码用于生成数据集及标签。

%matplotlib inline
import random
import torch
from d2l import torch as d2l

这里简单说明一下,%matplotlib inline 是一个在使用 Jupyter Notebook 或者 JupyterLab 这样的交互式环境中使用的魔法命令,它告诉这些环境将绘图直接嵌入到笔记本中,而不是在一个新的窗口里打开。这样做的好处是,绘制的图表会与生成它们的代码单元格紧密相连,便于查看和调试 。d2l是一个专注于深度学习的包,大家可以自己查找d2l包的下载教程,记住要下载到自己注册内核的那个环境中,我是直接pip进行下载的,但是网上好像有部分人直接下载发生报错,大家对症下药。

2.1 生成数据集

# 生成数据集
def synthetic_data(w,b,num_examples): #@save
    # 创建了一个形状为(num_examples,len(w))大小的张量,normal服从正态分布均值为0,标准差1
    X = torch.normal(0,1,(num_examples,len(w)))
    y = torch.matmul(X,w) + b
    y += torch.normal(0,0.01,y.shape)
    return X,y.reshape((-1,1))

 torch.normal表示生成一个服从正态分布的随机数,样本X 均值为0,标准差为1,形状为(num_examples,len(w)),torch.matmul实现后就与上述线性模型公式相同,大家可以自行观察是如何计算的。y += torch.normal(0,0.01,y.shape)表示加入的噪声\epsilon

最后返回生成的样本与标签,reshape是为了保证计算的y是只包含一个标签,原本矩阵y是一个(1,num_examples)的向量,转化后变为(num_examples,1)的向量。

2.2 展示生成的数据集

true_w = torch.tensor([2,-3.4])
true_b = 4.2
features,labels = synthetic_data(true_w,true_b,1000)
print('features:',features[0],'\nlabel:',labels[0])

这里带入权重与偏置参数,输出第一个样本与标签值。

2.3 绘制特征与标签图

这里样本具有两个特征,取第二个特征作为横轴,标签值作为纵轴绘制散点图。因为第二个特征对应的权重值为-3.4,在图中很容易看出两者呈负相关。

2.4 读取数据集

训练模型需要对数据集进行遍历,本次实验每次抽取小批量数据进行训练。梯度下降三种选取数据集样本的方式,随机梯度下降,小批量梯度下降和批量梯度下降。这里简单介绍一下三者的优缺点。

随机梯度下降,每次选取一个随机的样本进行训练,优:训练速度快,对cpu要求较低;缺:单个样本的梯度估计存在较大的方差,收敛过程较为动荡,可能只得到局部最优。

批量梯度下降,使用整个训练数据集来计算损失函数关于模型参数的梯度。优:使用了全部样本的梯度信息,更加稳定地收敛得到全局最优解。缺:数据集大,计算成本高,对cpu要求高。

小批量梯度下降,从训练集中随机选择一个大小为batch_size的小批量样本,优缺点:介于批量梯度下降与随机梯度下降两者之间,比较稳定,且训练速度较快。目前梯度下降选择最多的就是小批量梯度下降。

def data_iter(batch_size,features,labels):
    num_examples = len(features)
    indices = list(range(num_examples))
    # 随机读取样本
    random.shuffle(indices)
    for i in range(0,num_examples,batch_size):
        batch_indices = torch.tensor(
            indices[i:min(i + batch_size,num_examples)]
        )
        yield features[batch_indices],labels[batch_indices]

定义了一个data_iter函数用于生成小批量样本。indices中包含了每个样本的下标,如下所示:[0,1,2,3....num_examples],使用下标获取样本,方便我们打乱样本的顺序,做到随机抽取。

如何获取连续的小批量

未完待续

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

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

相关文章

C语言——————结构体

前言: 我们都已经学了很多int char …等类型还学到了同类型元素构成的数组,以及取上述类型的指针,在一些小应用可以灵活使用,然而,在实际问题中有时候我们需要几种数据类型一起来修饰某个变量。 例如一个学生的信息就…

2024 “华为杯” 中国研究生数学建模竞赛(F题)深度剖析|X射线脉冲星光子到达时间建模|数学建模完整代码+建模过程全解全析

当大家面临着复杂的数学建模问题时,你是否曾经感到茫然无措?作为2022年美国大学生数学建模比赛的O奖得主,我为大家提供了一套优秀的解题思路,让你轻松应对各种难题! CS团队倾注了大量时间和心血,深入挖掘解…

如何成为信息安全等级测评师?具体有哪些要求?

给大家的福利,点击下方蓝色字 即可免费领取↓↓↓ 🤟 基于入门网络安全/黑客打造的:👉黑客&网络安全入门&进阶学习资源包 文章目录 前言 信息安全等级测评师 定义与作用:证书颁发:能力要求&#x…

2024 “华为杯” 中国研究生数学建模竞赛(C题)深度剖析|数据驱动下磁性元件的磁芯损耗建模|数学建模完整代码+建模过程全解全析

当大家面临着复杂的数学建模问题时,你是否曾经感到茫然无措?作为2022年美国大学生数学建模比赛的O奖得主,我为大家提供了一套优秀的解题思路,让你轻松应对各种难题! CS团队倾注了大量时间和心血,深入挖掘解…

植保无人机是朝阳产业还是夕阳产业?

植保无人机产业是朝阳产业还是夕阳产业,可以从多个维度进行分析: 一、市场需求与增长趋势 市场需求:随着农业现代化的推进和劳动力成本的上升,植保无人机因其高效、安全、节省农药等优势,在农业生产中的应用越来越广…

Spring Boot赋能高校心理健康教育

1绪 论 1.1研究背景 随着计算机和网络技术的不断发展,计算机网络已经逐渐深入人们的生活,网络已经能够覆盖我们生活的每一个角落,给用户的网上交流和学习提供了巨大的方便。 当今社会处在一个高速发展的信息时代,计算机网络的发展…

【Python】探索 Errbot:多功能聊天机器人框架

不是旅行治愈了你,是你在路上放过了自己。 在当今的数字化时代,聊天机器人已成为企业与客户互动、提升工作效率和增加乐趣的重要工具。Errbot是一个高度可扩展的聊天机器人框架,它允许开发者使用Python轻松创建和定制机器人。本文将介绍Errb…

【linux008】目录操作命令篇 - rmdir 命令

文章目录 1、基本用法2、常见选项3、举例4、注意事项 rmdir 是 Linux 系统中的一个命令,用于删除空目录。它只能删除 空目录,如果目录中存在文件或子目录,则无法删除。 1、基本用法 rmdir [选项] 目录名...2、常见选项 -p, --parents&…

1.4 MySql配置文件

既然我们开始学习数据库,就不能像大学里边讲数据库课程那样简单讲一下,增删改查,然后介绍一下怎么去创建索引,怎么提交和回滚事务。我们学习数据库要明白怎么用,怎么配置,学懂学透彻了。当然MySql的配置参数…

关于群里脱敏系统的讨论2024-09-20

群里大家讨论脱敏系统,傅同学:秦老师,银行数据脱敏怎么做的,怎么存储的? 采购了脱敏系统,一般是硬件(厂商直接卖的一体机)。这个系统很复杂,大概卖50-100万一台。 最核…

为什么消费还能返利?2024年全新返利模型!

在当今竞争激烈的电商市场中,一种名为“循环购”的创新商业模式正悄然兴起,以其独特的消费返利机制和积分体系,为消费者带来了前所未有的购物体验 一、循环购模式:消费即投资的智慧选择 循环购模式并非简单的消费行为&#xff0c…

MySQL | 知识 | 从底层看清 InnoDB 数据结构

文章目录 一、InnoDB 简介InnoDB 行格式COMPACT 行格式CHAR(M) 列的存储格式VARCHAR(M) 最多能存储的数据记录中的数据太多产生的溢出行溢出的临界点 二、表空间文件的结构三、InnoDB 数据页结构页页的概览Infimum 和 Supremum使用Page Directory页的真实面貌 四、B 树是如何进…

重生奇迹MU 强化玩法套路多 极品装备由你打造

欢迎来到重生奇迹MU的强化玩法指南!想要打造极品装备吗?不可错过这篇文章,我们将为您揭开最多套路的强化技巧和窍门,帮您节省时间和资源,并带来最高效的升级结果。无论您是新手还是老玩家,本文适合所有级别…

基于MySQL全量备份+GTID同步的主从架构恢复数据至指定时间点

系列文章目录 基于GTID同步搭建主从复制 MySQL全量备份 文章目录 系列文章目录前言一、环境准备二、构建测试数据1.安装sysbench2.构建测试数据3.准备全量备份4.将全量备份和binlog拷贝到临时数据库服务器5.模拟误删除表操作 三、恢复数据到指定时间点1.临时数据库恢复数据2.找…

【Delphi】中的数据绑定(LiveBindings)

LiveBindings 是 RAD Studio 中 VCL 和 FireMonkey 框架都支持的数据绑定功能。 LiveBindings 是一个基于表达式的框架,这意味着它使用绑定表达式将对象绑定到其他对象或数据集字段。 LiveBindings 概述 LiveBindings 基于关系表达式,即绑定表达式&am…

react 甘特图之旅

react-gantt GitHub 仓库: https://github.com/clayrisser/react-gantt react-gantt-chart GitHub 仓库: https://github.com/MaTeMaTuK/gantt-task-react easy-gant-beta GitHub 仓库: https://github.com/web-widgets/react-gantt-demos 上面的版本不兼容 dhtmlx-gant…

一周热门|比GPT-4强100倍,OpenAI有望年底发布GPT-Next;1个GPU,1分钟,16K图像

大模型周报将从【企业动态】【技术前瞻】【政策法规】【专家观点】四部分,带你快速跟进大模型行业热门动态。 01 企业动态 Ilya 新公司 SSI 官宣融资 10 亿美元 据路透社报道,由 OpenAI 联合创始人、前首席科学家 Ilya Sutskever 在 2 个多月前共同创…

抖音如何改ip地址到另外城市

在数字化时代,抖音作为广受欢迎的社交媒体平台,不仅连接了亿万用户,也成为了展示个人生活、分享创意内容的重要舞台。然而,有时候出于隐私保护等需求,用户可能希望更改抖音账号显示的IP地址,使其看起来像是…

奇安信渗透2面经验分享

《网安面试指南》http://mp.weixin.qq.com/s?__bizMzkwNjY1Mzc0Nw&mid2247484339&idx1&sn356300f169de74e7a778b04bfbbbd0ab&chksmc0e47aeff793f3f9a5f7abcfa57695e8944e52bca2de2c7a3eb1aecb3c1e6b9cb6abe509d51f&scene21#wechat_redirect 《Java代码审…

泛微E9开发 创建自定义浏览框,关联物品管理表【1】

创建自定义浏览框,关联物品管理表【1】 1、自定义浏览框1.1 概念1.2 前端样式 2、创建物品管理表2.1 新建建模表单操作方法2.2 物品管理表 3、创建浏览按钮 1、自定义浏览框 1.1 概念 自定义浏览框可以理解为是建模引擎中的表与表关联的一个桥梁。比如利用建模引擎…