深度学习之预备知识

news2025/1/18 2:14:25

深度学习是关于优化的学习。对一个带有参数的模型,找到其中能拟合数据最好的模型。

一、数据操作

  张量:表示一个由数值组成的数组,这个数组可能有多个维度。具有一个轴的张量对应数学上的向量,具有两个轴的张量对应数学上的矩阵,具有两个以上轴的张量没有特定的数学名称。
  深度学习的张量与Numpy类似,但深度学习框架比Numpy的ndarray多一些重要功能:首先,GPU很好支持加速计算,而Numpy仅支持CPU计算;其次,张量类支持自动微分。这类功能使得张量类更适合深度学习。
  导入torch,虽然它被称为Pytorch。但代码中使用torch而不是pytorch。

import torch
x=torch.arange(12)
x.shape    #访问张量形状
x.numel()  #计算张量中总数,即形状的所有元素乘积
X=x.reshape(3,4) #通过reshape函数,改变张量的形状而不改变元素数量和元素值。
x.reshape(-1,4)或者reshape(3,-1) #通过-1来调用此自动计算出形状
#创建全为0或者1的张量
torch.zeros((2,3,4))
torch.ones((2,3,4))
##通过某个特定概率分布中随机采样来得到张量中每个元素的值
torch.randn(3,4) #均值0,标准差为1的正态分布中随机采样
##通过提供办好数值的python列表来为张量的每个元素赋值
torch.tensor([2,1,4,3],[1,2,3,4],[4,3,2,1]]) #外层列表对应轴0,内层列表对应轴1

1.1 运算符

import torch
x=torch.tensor([1,2,4,8])
y=torch.tensor([2,2,2,2])
x+y,x-y,x*y,x/y
torch.exp(x)  #求幂
x.sum()  #对张量中的所有元素求和,会产生一个单元素张量
  • 多个张量连接cat
x=torch.arange(12,dtype=torch.float32).reshape(3,4)
y=torch.tensor([[2.0,1.0,4.0,5.0],[3.0,2.0,1.0,2.0],[6.0,7.0,8.0,9.0]])
torch.cat((x,y),dim=0),torch.cat((x,y),dim=1)

在这里插入图片描述

1.2 广播机制

  1.1中看到如何在相同形状的两个张量上执行按元素操作,在某些情况下,即使形状不同,我们仍然可以通过调用广播机制来执行按元素操作。这种机制的工作方式如下:
(1)通过适当复制元素来扩展一个或两个数组,以便在转换之后,两个张量具有相同的形状;
(2)对生成的数组执行按元素操作
  在大多数情况下,我们将沿着数组中长度为1的轴进行广播,如下:

import torch
x=torch.arange(3).reshape(3,1)
y=torch.arange(2).reshape(1,2)
x,y
x+y

在这里插入图片描述
  由于x和y分别是3x1矩阵和1x2矩阵,它们的形状不匹配,如果相加,矩阵x将复制列,矩阵y将复制行,实现两个矩阵广播为一个更大的3x2矩阵。

1.3 索引和切片

  与python数组一样,张量中的元素可以通过索引访问,第一个元素的索引是0,最后一个元素的索引是-1。

x=torch.arange(12,dtype=torch.float32).reshape(3,4)
x[-1],x[1:3]

在这里插入图片描述

  • 可以通过指定索引来将元素写入矩阵
x[1,2]=9
x

在这里插入图片描述

  • 想为多个元素赋予相同的值,只需要索引所有元素,然后为它们赋值。
x[0:2,:]=12
x

在这里插入图片描述

1.4 转换为其他python对象

  将深度学习框架定义的张量转换为numpy张量很容易,反之也同样容易。torch张量和numpy数组将共享它们的底层内存,就地操作更改一个张量也会同时更改另一个张量。

import torch
a=x.numpy()
b=torch.tensor(a)
type(a),type(b)

在这里插入图片描述

  • 要将大小为1的张量转换为python标量,可以调用item函数或python的内置函数。
import torch
a=torch.tensor([3.5])
a,a.item(),float(a),int(a)

在这里插入图片描述

二、数据预处理

  在python常用的数据分析中,通常使用pandas包,与庞大的python生态系统中的许多其他扩展包一样,pandas可以与张量兼容。接下来介绍pandas预处理原始数据,并将原始数据转换为张量格式的步骤。

2.1 读取数据集

import pandas as pd
data =pd.read_excel('data.xlsx')
print(data)

在这里插入图片描述

2.2 处理缺失值

  通过位置索引 iloc,将data分成 inputs 和 outputs,其中前者为data的前两列,后者为data的最后一列,对于inputs 中的缺失值,用一列的均值替换NaN项。

inputs,outputs=data.iloc[:,0:2],data.iloc[:,2]
inputs=inputs.fillna(inputs.mean())
print(inputs)

在这里插入图片描述
  将NaN视为一个类别,由于Alley列只接受两种类型值Pave和NaN,pandas可以自动将此列转换为两列Alley_pave和Alley_nan。Alley列为pave的行会将Alley_pave的值设置为1,Alley_nan的值设置为0。

inputs=pd.get_dummies(inputs,dummy_na=True)
print(inputs)

在这里插入图片描述

2.3 转换为张量格式

  • 现在inputs和outputs中的所有条目都是数值类型,它们可以转换为张量格式。
X,y=torch.tensor(inputs.values),torch.tensor(outputs.values)
X,y

在这里插入图片描述

三、线性代数

3.1 标量

标量由只有一个元素的张量表示。

x=torch.tensor(3.0)
y=torch.tensor(2.0)
x+y,x*y,x/y,x**y

在这里插入图片描述

3.2 向量

  向量可以被视为标量值组成的列表,这些标量值被称为向量的元素。当向量表示数据集中的样本时,它们的值具有一定的实际意义。在数学上,具有一个轴的张量表示向量。

x=torch.arange(4)
x

在这里插入图片描述
与普通的python数组一样,可以通过调用python的内置函数len来访问张量的长度,shape属性访问向量的长度。

X=torch.arange(12,dtype=torch.float32).reshape(3,4)
len(X),X.shape

在这里插入图片描述

3.3 矩阵

正如向量将标量从零阶推广到一维,矩阵将向量从一维推广到二维。在代码中表示为具有两个轴的张量。

X=torch.arange(16).reshape(4,4)
X,X.T

在这里插入图片描述

3.4 张量算法的基本性质

标量、向量、矩阵和任意数量轴的张量由一些使用的属性。

X=torch.arange(16).reshape(4,4)
y=X.clone()  #通过分配新的内存,将X的一个副本分配给y
X,X+y,X*y

在这里插入图片描述
将张量加上或乘以一个标量不会改变张量的形状,其中张量的每个元素都将与标量相加或相乘。

a=2
X=torch.arange(24).reshape(2,3,4)
a+X,(a*X).shape

在这里插入图片描述

3.5 降维

我们可以对任意张量进行的一个有用的操作是计算其元素的和。

X=torch.arange(24).reshape(2,3,4)
X,X.sum()
X.sum(axis=0)#对所有的行元素求和
X.sum(axis=1)#对所有的列元素求和

在这里插入图片描述

  • 非降维求和

有时在调用函数来计算总和或平均值时保持轴数不变会很有用。keepdims=True

A=torch.arange(20).reshape(5,4)
sum_a=A.sum(axis=1)
sum_A=A.sum(axis=1,keepdims=True)
A,sum_a,sum_A,A/sum_A,A.cumsum(axis=0)#按行累计求和

在这里插入图片描述

3.6 点积

点积:相同位置的按元素乘积的和。

x=torch.arange(4,dtype=torch.float32)
y=torch.ones(4,dtype=torch.float32)
x,y,torch.dot(x,y)
  • 矩阵-向量积

使用mv函数表示矩阵-向量积,矩阵A和向量x调用torch.mv(A,x)时,执行矩阵-向量积。

A=torch.arange(20).reshape(5,4)
x=torch.arange(4)
A,x,torch.mv(A,x)

在这里插入图片描述

  • 矩阵-矩阵乘法(矩阵乘法)
A=torch.arange(20,dtype=torch.float32).reshape(5,4)
B=torch.ones(4,3)
torch.mm(A,B)

在这里插入图片描述

3.7 范数

  线性代数中最有用的一些运算符是范数,向量的范数表示一个向量有多大。这里考虑的大小概念不涉及维度,而是分量的大小。在线性代数中,向量范数是将向量映射到标量的函数 f 。给定任意向量 x ,向量范数具有如下性质:
(1)如果按常数因子 ɑ 缩放向量的所有元素,其范数也会按相同常熟因子的绝对值缩放:f(ɑx)=|ɑ|f(x)
(2)f(x+y)≤f(x)+f(y)
(3)非负性f(x)≥0
  范数很像距离的度量,欧几里得距离是一个L2范数:假设 n 维向量 x 中的元素是x1,…,xn,其L2范数是向量元素平方和的平方根。
在这里插入图片描述

import torch
u=torch.tensor([3.0,-4.0])
torch.norm(u)

在这里插入图片描述
深度学习中经常使用L2范数的平方,也会经常遇到L1范数,它表示为向量元素的绝对值之和:
在这里插入图片描述
与L2范数相比,L1范数受异常值的影响较小。为了计算L1范数,我们将绝对值函数和按元素求和组合起来。

torch.abs(u).sum()

在这里插入图片描述
L2范数和L1范数都是更一般的LP范数的特例:
在这里插入图片描述

四、自动微分

  在深度学习中,我们“训练”模型,不断更新它们,使它们在见到越来越多的数据时变得越来越好。通常情况下,变得更好意味着最小化一个损失函数,即一个衡量“模型有多糟糕”这个问题的分数。最终我们真正关心的是生成一个模型,它能够在从未见到过数据上表现良好。但“训练”模型只能将模型与我们实际见到的数据相拟合。因此,我们可以将拟合模型的任务分解为两个关键问题。

  • 优化:用模型拟合观察数据的过程。
  • 泛化:模型不仅在训练集表现良好,在未知的数据(测试集)也表现良好,即具有良好的泛化能力。

  求导是几乎所有深度学习优化算法的关键步骤,虽然求导的计算简单,但对于复杂的模型,手动进行更新是一件痛苦的事情,深度学习框架通过自动计算导数,即自动微分来加快求导。实践中,根据设计好的模型,系统会构建一个计算图,来跟踪计算是哪些数据通过哪些操作组合起来产生输出。自动微分使系统能够随后反向传播梯度。这里,反向传播意味着跟踪整个计算图,填充关于每个参数的偏导数。

import torch
x = torch.arange(4.0, requires_grad=True)  # 设置 requires_grad=True 使得 x 被标记为需要计算梯度的张量。
y = 2 * torch.dot(x, x)
y.backward()  #调用 y.backward() 后,x.grad 会保存 x 关于 y 的梯度。
print(x.grad)  # 输出 x 的梯度

在这里插入图片描述
函数y=2*x^2关于x的梯度应为4x,验证梯度是否正确:

x.grad==4*x

在这里插入图片描述
计算x的另一个函数:

x.grad.zero_() #将x的梯度清零的操作。通常在反向传播 (backward) 之前或之后调用它,目的是防止梯度的累积。
y=x.sum() 
y.backward()
x.grad

在这里插入图片描述

4.1 分离计算

  有时,我们希望将某些计算移到记录的计算图之外。例如,假设y是作为x的函数计算的,而z则是作为y和x的函数计算的。想计算z关于x的梯度,但由于某种原因,希望将y视为一个常数,并且只考虑x在y被计算后发挥的作用。
  这里可以分离y来返回一个新变量u,该变量与y具有相同的值,但丢弃计算图中如何计算y的任何信息,换句话说,梯度不会向后流经u到x。因此,下面的反向传播函数计算z=ux关于x的偏导数,同时将u作为常数处理,而不是计算z=xx*x关于x的偏导数。

x.grad.zero_()
y=x*x
u=y.detach() #创建一个新的张量 u,它是 y 的一个 detach 副本。detach() 是 PyTorch 中的一个方法,用于返回一个新的张量,该张量与原始张量 y 共享相同的数据,但不会参与梯度计算,也就是说,它与计算图分离了。
z=u*x  # u 是通过 y.detach() 得到的,所以 u 不再跟踪梯度,而 x 仍然是需要梯度的。因此,这条语句不会改变 x 的梯度计算行为,但会产生一个新的张量 z。
z.sum().backward() #计算 z 的所有元素的和,然后对其进行反向传播,计算 x 的梯度。
x.grad==u #x.grad 会被更新,存储关于 x 的梯度值。

在这里插入图片描述

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

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

相关文章

【论文相关】期刊/会议 信息检索——IEEE各期刊投稿要求(待完善)

[吐槽] 外文期刊/会议网站的真的很难找,想要了解的信息很难检索;比如 旗下子期刊官网、子期刊具体要求不同等问题。 TIFS期刊 (IEEE Transactions on Information Forensics and Security) 期刊官网链接:https://mc.manuscriptcentral.com/…

ElementUI:el-tabs 切换之前判断是否满足条件

<div class"table-card"><div class"card-steps-class"><el-tabsv-model"activeTabsIndex":before-leave"beforeHandleTabsClick"><el-tab-pane name"1" label"基础设置"><span slot&…

入职体检心电图不合格的常见情况

心电图&#xff08;ECG&#xff09;是通过记录心脏的电活动来评估心脏健康状况的一项常见检查。它是体检中常见的检查项目之一&#xff0c;尤其对于从事需要高度体力活动的职业&#xff08;如医护、公安、消防等&#xff09;或对心脏健康有特别要求的行业&#xff0c;心电图的结…

释放 AI 潜能:掌握提问策略,让 AI 事半功倍

在这个 AI 大模型快速迭代的时代&#xff0c;人人都能免费使用 AI。然而&#xff0c;很多人却发现&#xff0c;自己与 AI 互动的效果并不理想。这并非 AI 的问题&#xff0c;而是方法不对。输入决定输出&#xff0c;只有掌握正确的提问策略&#xff0c;才能真正释放 AI 助手的生…

AI赋能:构建安全可信的智能电子档案库

在档案的政策与法规上&#xff0c;《中华人民共和国档案法》2020年修订新增&#xff0c;对电子档案的合法要件、地位和作用、安全管理要求和信息化系统建设等方面作出了明确规定&#xff0c;保障数字资源的安全保存和有效利用。 日前&#xff0c;国家档案局令第22号公布《电子…

【计算机网络】实验12:网际控制报文协议ICMP的应用

实验12 网际控制报文协议ICMP的应用 一、实验目的 验证ping命令和tracert命令的工作原理。 二、实验环境 Cisco Packet Tracer模拟器 三、实验过程 1.构建网络拓扑并进行信息标注&#xff0c;将所需要配置的IP地址写在对应的主机或者路由器旁边&#xff0c;如图1所示。 图…

【C语言】程序设计--算法

文章目录 1. 判断两个数的大小并交换2. 计算三角形面积3. 根据x的值计算y4. 字符大小写转换5. 百钱百鸡问题6. 计算公式y的值7. 输出所有的水仙花数8. 计算n的阶乘9. 下三角数据10. 斐波那契数列11. 学生成绩统计12. 数组的平均值1. 判断两个数的大小并交换 介绍: 从键盘输入…

使用IntelliJ IDEA开发Gradle插件并发布到本地

博主所用软件版本为&#xff1a; IntelliJ IDEA 2024.1.4 (Community Edition) Android Studio Ladybug Feature Drop | 2024.2.2 Beta 1 1、制作gradle插件&#xff08;IntelliJ IDEA 2024.1.4&#xff09; 新建groovy工程&#xff0c;File–>New–>Project… 右键点…

Trimble X9三维激光扫描仪高效应对化工厂复杂管道扫描测绘挑战【沪敖3D】

化工安全关系到国计民生&#xff0c;近年来随着化工厂数字化改革不断推进&#xff0c;数字工厂逐步成为工厂安全管理的重要手段。而化工管道作为工厂设施的重要组成部分&#xff0c;由于其数量多、种类繁杂&#xff0c;一直是企业管理的重点和难点。 传统的化工管廊往往缺乏详…

如何实现远程对主机进行关机、重启操作

WGCLOUD是一款开源免费的运维工具&#xff0c;使用简单&#xff0c;安装方便 我们主要通过 WGCLOUD监控系统的指令下发模块&#xff0c; 来实现关机和重启主机的操作 这里以Linux主机为例说明&#xff0c;Windows也是一样的&#xff0c;只是重启主机的命令不同而已&#xff0c…

【批处理脚本】更改Windows系统中的 hosts 解析文件

概述 作用 修改 Windows 系统中的 hosts 文件&#xff0c;可以实现 插入 或 删除 条目。该脚本允许用户以管理员权限执行&#xff0c;将特定的域名解析到指定的 IP 地址 应用场景 非常适用于需要频繁或批量修改 hosts 文件的场景&#xff1a; 屏蔽网站、域名重定向、DNS 污染防…

无人机舵机驱动控制原理!

一、舵机的基本结构和工作原理 舵机是一种位置&#xff08;角度&#xff09;伺服的驱动器&#xff0c;由电子控制与机械控制部分组成。当控制信号输入时&#xff0c;电子控制部分会根据控制器的指令调节直流电机输出的旋转角度和速度&#xff0c;由机械部分转化为控制面的位移…

gozero项目迁移与新服务器环境配置,包含服务器安装包括go版本,Nginx,项目配置包括Mysql,redis,rabbit,域名

迁移 **GoZero** 项目到新服务器并配置相关环境涉及多个步骤。以下是一个系统化的指南&#xff0c;涵盖服务器环境安装、数据库和缓存配置、项目部署以及域名绑定。 ### 步骤概述 1. **服务器环境配置** - 安装 Go 语言环境 - 安装 Nginx - 安装 MySQL 和 Redis -…

华为交换机配置基础

文章目录 华为设备配置视图ensp入门拓扑搭建和IP地址配置IP地址和网关静态路由配置动态路由RIP路由配置 OSPF配置单臂路由【实现不同vlan之间互联互通】console 密码模式AAA认证的原理和配置telnet 远程登录 华为设备配置视图 华为设备登录配置 <AR> system-view //进入…

善于运用指针--通过指针引用数组

一个数组包含若干个元素&#xff0c;每个元素在内存中占用储存单元&#xff0c;它们都有相应的地址&#xff0c;指针变量能指向变量&#xff0c;也可以指向地址。所谓数组元素的地址&#xff0c;也就是数组元素的指针。 文章目录 前言一、在引用数组元素时指针的运算二、通过指…

word poi-tl 图表功能增强,插入图表折线图、柱状图、饼状图

目录 问题解决问题poi-tl介绍 功能实现引入依赖功能介绍 功能实例饼图模版代码效果图 雷达图&#xff08;模版同饼图&#xff09;代码效果图 柱状图&#xff08;模版同饼图&#xff09;代码效果图 附加CustomCharts 工具类CustomChartSingleSeriesRenderData 数据对象CustomCha…

QT数据库SQLite:QsqlTableModel使用总结

数据库连接、数据模型与界面组件所涉及的类之间的关系如下所示&#xff1a; 数据库类 QSqlDatabase 类用于建立与数据库的连接&#xff0c;QSqlDatabase 对象就表示这种连接。QSqlDatabase 类的功能主要分为三大部分&#xff1a; 1、创建数据库连接&#xff0c;即创建 QSqlDat…

[MoeCTF 2022]what are y0u uploading?

[BJDCTF 2020]签个到? 解压后发现两个文件夹&#xff0c;进去发现有个压缩包 这里压缩包打不开&#xff0c;就直接给改成png后缀 发现变成了一个二维码 然后用QR工具扫一下 得到flag NSSCTF{i_am_a_tupian} [MoeCTF 2022]what are y0u uploading&#xff1f; 右击查看源码…

查询品牌涉及两张表(brand、brand_admin_mapping)

文章目录 1、BrandController2、AdminCommonService3、BrandApiService3、BrandCommonService4、BrandSqlService涉及的表SQL 查询逻辑参数处理执行查询完整 SQL 逻辑参数映射总结 SELECT * FROM brand_admin_mapping WHERE admin_id 252SELECT * FROM brand WHERE id 44SELE…

k8s 为什么需要Pod?

Pod&#xff0c;是 Kubernetes 项目中最小的 API 对象&#xff0c;更加专业的说&#xff0c;Pod&#xff0c;是 Kubernetes 项目的原子调度单位。 Pod 是 Kubernetes 里的原子调度单位。这就意味着&#xff0c;Kubernetes 项目的调度器&#xff0c;是统一按照 Pod 而非容器的资…