当前位置: 首页 > news >正文

PyTorch基础(Numpy与Tensor)

Numpy与Tensor

第1章已经介绍了Numpy,了解到其存取数据非常方便,而且还拥有大量的函数,所
以深得数据处理、机器学习者喜爱。这节我们将介绍PyTorch的Tensor,它可以是零维
(又称为标量或一个数)、一维、二维及多维的数组。Tensor自称为神经网络界的
Numpy,它与Numpy相似,二者可以共享内存,且之间的转换非常方便和高效。不过它们
也有不同之处,最大的区别就是Numpy会把ndarray放在CPU中进行加速运算,而由Torch
产生的Tensor会放在GPU中进行加速运算(假设当前环境有GPU)。

Tensor概述

对Tensor的操作很多,从接口的角度来划分,可以分为两类:
1)torch.function,如torch.sum、torch.add等;
2)tensor.function,如tensor.view、tensor.add等。
这些操作对大部分Tensor都是等价的,如torch.add(x,y)与x.add(y)等价。在实际使用
时,可以根据个人爱好选择。
如果从修改方式的角度来划分,可以分为以下两类:
1)不修改自身数据,如x.add(y),x的数据不变,返回一个新的Tensor。
2)修改自身数据,如x.add_(y)(运行符带下划线后缀),运算结果存在x中,x被修
改。

import torchx=torch.tensor([1,2])
y=torch.tensor([3,4])
z=x.add(y)
print(z)
print(x)
x.add_(y)
print(x)

运行结果

tensor([4, 6])
tensor([1, 2])
tensor([4, 6])

创建Tensor

创建Tensor的方法有很多,可以从列表或ndarray等类型进行构建,也可根据指定的形
状构建。常见的创建Tensor的方法可参考表2-1。

函数功能
Tensor(*size)直接从参数构造一个的张量,支持List,Numpy数组
eye(row,column)创建指定行数,列数的过维单位Tensor
linspace(start,end,steps)从start到end,均匀切分成steps份
logspace(start,end,steps)从10start,到10end,均匀切分成steps份
rand/randn(*size)生成(0,1)均匀分布/标准正态分布数据
ones(*size)返回指定shape的张量,元素初始为1
zeros(*size)返回指定shape的张量,元素初始为0
one_slike(t)返回与T的shape相同的张量,且元素初始为1
zeros_like(t)返回与T的shape相同的张量,且元素初始为0
arange(start,end,step)在区间[start,end]上以间隔step生成一个序列张量
from_Numpy(ndarray)从ndarray创建一个Tensor

下面举例说明。

import torch#根据list数据生成Tensor
torch.Tensor([1,2,3,4,5,6])
#根据指定形状生成Tensor
torch.Tensor(2,3)
#根据给定的Tensor的形状
t=torch.Tensor([1,2,3],[4,5,6])
#查看Tensor的形状
t.size()
#shape与size()等价方式
t.shape
#根据已有形状创建Tensor
torch.Tensor(t.size())

【说明】
注意torch.Tensor与torch.tensor的几点区别:
1)torch.Tensor是torch.empty和torch.tensor之间的一种混合,但是,当传入数据时,
torch.Tensor使用全局默认dtype(FloatTensor),而torch.tensor是从数据中推断数据类型。
2)torch.tensor(1)返回一个固定值1,而torch.Tensor(1)返回一个大小为1的张量,它是
随机初始化的值。

import torcht1=torch.Tensor(1)
t2=torch.tensor(1)
print("t1的值{},t1的数据类型{}".format(t1,t1.type()))
print("t2的值{},t2的数据类型{}".format(t2,t2.type()))

运行效果

t1的值tensor([0.]),t1的数据类型torch.FloatTensor
t2的值1,t2的数据类型torch.LongTensor

下面是根据一定规则,自动生成Tensor的一些例子。

import torch#生成一个单位矩阵
torch.eye(2,2)
#自动生成全是0的矩阵
torch.zeros(2,3)
#根据规则生成数据
torch.linspace(1,10,4)
#生成满足均匀分布随机数
torch.rand(2,3)
#生成满足标准分别随机数
torch.randn(2,3)
#返回所给数据形状相同,值全为0的张量
torch.zeros_like(torch.rand(2,3))

修改Tensor形状

在处理数据、构建网络层等过程中,经常需要了解Tensor的形状、修改Tensor的形
状。与修改Numpy的形状类似,修改Tenor的形状也有很多类似函数,具体可参考表2-2。

函数说明
size()返回张量的shape属性值,与函数shape(0.4版新增)等价
numel(input)计算Tensor的元素个数
view(*shape)修改Tensor的shape,与Reshape(0.4版新增)类似,但View返回的对象与源Tensor共享内存,修改一个,另一个同时修改囗Reshape将生成新的Tensor,而且不要求源Tensor是连续的。View(-1)展平数组
restze类似于view,但在size超出时会重新分配内存空间
item若Tensor为单元素,则返回Python的标量
unsqueeze在指定维度增加一个"1"
squeeze在指定维度压缩一个"1"

以下为一些实例:

import torch#生成一个形状为2x3的矩阵
x=torch.randn(2,3)
#查看矩阵的形状
x.size() #结果为torch.Size([2,3])#查看X的维度
x.dim() #结果为2
#把x变为3x2的矩阵
x.view(3,2)
#把x展平为1维向量
y=x.view(-1)
y.shape
#添加一个维度
z=torch.unsqueeze(y,0)
#查看Z的形状
z.size() #结果为torch.Size([1,6])
#计算Z的元素个事
z.numel()  #结果为6

【说明】
torch.view与torch.reshpae的异同
1)reshape()可以由torch.reshape(),也可由torch.Tensor.reshape()调用。但view()只可由
torch.Tensor.view()来调用。
2)对于一个将要被view的Tensor,新的size必须与原来的size与stride兼容。否则,在
view之前必须调用contiguous()方法。
3)同样也是返回与input数据量相同,但形状不同的Tensor。若满足view的条件,则不会copy,若不满足,则会copy。
4)如果你只想重塑张量,请使用torch.reshape。如果你还关注内存使用情况并希望确
保两个张量共享相同的数据,请使用torch.view。

索引操作

Tensor的索引操作与Numpy类似,一般情况下索引结果与源数据共享内存。从Tensor
获取元素除了可以通过索引,也可以借助一些函数,常用的选择函数可参考表2-3。

函数说明
index_select(input,dim,index)在指定维度上选择一些行或列
nonzero(input)获取非0元素的下标
masked_select(input,mask)使用二元值进行选择
gather(input,dim,index)在指定维度上选择数据,输出的形状与index(index的类型必须是LongTensor类型的)一致
scatter_(input,dim,index,src)为gather的反操作,根据指定索引补充数据

以下为部分函数的实现代码:

import torch#设置一个随机种子
torch.manual_seed(100)
#生成一个形状为2X3的矩阵
x=torch.randn(2,3)
#根据索引获取第1行,所有数据
x[0,:]
#获取最后一列数据
x[:,-1]
#生成是否大于0的Byter张量
mask=x>0
#获取大于0的值
torch.masked_select(x,mask)
#获取非0下标,即行,列索引
torch.nonzero(mask)
#获取指定索引对应的值,输出根据以下规则得到
index=torch.LongTensor([[0,1,1]])
torch.gather(x,0,index)
a=torch.gather(x,1,index)
#把a的值返回到一个2x3的0矩阵中
z=torch.zeros(2,3)
z.scatter_(1,index,a)

广播机制

在1.7节中介绍了Numpy的广播机制,广播机制是向量运算的重要技巧。PyTorch也支
持广播机制,以下通过几个示例进行说明。
与Numpy一样,Tensor也有逐元素操作(Element-Wise),且操作内容相似,但使用
函数可能不尽相同。大部分数学运算都属于逐元素操作,其输入与输出的形状相同。常见
的逐元素操作可参考表2-4。

【说明】
这些操作均会创建新的Tensor,如果需要就地操作,可以使用这些方法的下划线版
本,例如abs_。

函数说明
abs/add绝对值/加法
addcdiv(t,v,t1,t2)t1与t2的按元素除后,乘v加t
addcmul(t,v,t1,t2)t1与t2的按元素乘后,乘v加t
ceil/floor向上取整/向下取整
clamp(t,min,max)将张量元素限制在指定区间
exp/log/pow指数/对数/幂
mul(或*)/neg元素乘法/取反
sigmoid/tanh/softmax激活函数
sign/sqlt取符号/开根号

以下为部分逐元素操作代码实例。

import torcht=torch.randn(1,3)
t1=torch.randn(3,1)
t2=torch.randn(1,3)
#t+0.1*(t1/t2)
torch.addcdiv(t,0.1,t1,t2)
#计算sigmoid
torch.sigmoid(t)
#将t限制在[0,1]之间
torch.clamp(t,0,1)
#t+2进行就地运算
t.add_(2)

归并操作

归并操作顾名思义,就是对输入进行归并或合计等操作,这类操作的输入输出形状一
般并不相同,而且往往是输入大于输出形状。归并操作可以对整个Tensor,也可以沿着某
个维度进行归并。常见的归并操作可参考表2-5。

函数说明
cumprod(t,axis)在指定维度对t进行累积
cumsum在指定维度对t进行累加
dist(a,b,p=2)返回a,b之间的p阶范数
mean/median均值/中位数
std/var标准差/方差
norm(t,p=2)返回t的p阶范数
prod(t)/sum(t)返回t所有元素的积/和

【说明】
归并操作一般涉及一个dim参数,指定沿哪个维进行归并。另一个参数是keepdim,说
明输出结果中是否保留维度1,缺省情况是False,即不保留。
以下为归并操作的部分代码:

import torch#生成一个函数6个数的向量
a=torch.linspace(0,10,6)
#使用view方法,把a变化2x3矩阵
a=a.view((2,3))
#沿y轴方向累加,即dim=0,并保留含1的维度
b=a.sum(dim=0,keepdim=True) #b的形状为[1,3]

比较操作

比较操作一般是进行逐元素比较,有些是按指定方向比较。常用的比较函数可参考表
2-6。

函数说明
eq比较Tensor是否相等,支持broadcast
equal比较Tensor是否有相同的shape与值
ge/le/gt/lt大于/小于比较/大于等于/小于等于比较
max/min(t,axis)返回最值,若指定axis,则额外返回下标
topk(t,k,axis)在指定的axis维上取最高的K个值

以下是部分函数的代码实现。

import torchx=torch.linspace(0,10,6).view(2,3)
#求所有元素的最大值
torch.max(x)  #结果为10
#求y轴方向的最大值
torch.max(x,dim=0)#结果为[6,8,10]
#求最大的2个元素
torch.topk(x,1,dim=0)#结果为[6,8,10]对应索引为tensor([[1,1,1]

矩阵操作

机器学习和深度学习中存在大量的矩阵运算,常用的算法有两种:一种是逐元素乘
法,另外一种是点积乘法。PyTorch中常用的矩阵函数可参考表2-7。
常用矩阵函数

函数说明
dot(t1, t2)计算张量(1D)的内积或点积
mm(mat1, mat2)/bmm(batch1, batch2)计算矩阵乘法(含 batch 的 3D 矩阵乘法)
mv(t1, v1)计算矩阵与向量乘法
t转置
svd(t)计算 t 的 SVD 分解

【说明】
1)Torch的dot与Numpy的dot有点不同,Torch中的dot是对两个为1D张量进行点积运
算,Numpy中的dot无此限制。
2)mm是对2D的矩阵进行点积,bmm对含batch的3D进行点积运算。
3)转置运算会导致存储空间不连续,需要调用contiguous方法转为连续。

import torcha=torch.tensor([2,3])
b=torch.tensor([3,4])torch.dot(a,b) #运行结果为18
x=torch.randint(10,(2,3))
y=torch.randint(6,(3,4))
torch.mm(x,y)
x=torch.randint(10,(2,2,3))
y=torch.randint(6,(2,3,4))
torch.bmm(x,y)

PyTorch与Numpy比较

PyTorch与Numpy有很多类似的地方,并且有很多相同的操作函数名称,或虽然函数
名称不同但含义相同;当然也有一些虽然函数名称相同,但含义不尽相同。有些很容易混
淆,下面我们把一些主要的区别进行汇总,具体可参考表2-8。
以下是表格内容的提取整理:

image

http://www.lryc.cn/news/620185.html

相关文章:

  • 可搜索的 HTML 版本 Emoji 图标大全,可以直接打开网页使用,每个图标可以点击复制,方便使用
  • Mac安装ant
  • WPS文字和Word文档如何选择多个不连续的行、段
  • Date/Calendar/DateFormat/LocalDate
  • Linux中备份的练习
  • element-ui 时间线(timeLine)内容分成左右两侧
  • 数据分析小白训练营:基于python编程语言的Numpy库介绍(第三方库)(下篇)
  • 车载软件架构 --- MCU刷写擦除相关疑问?
  • 《红黑树驱动的Map/Set实现:C++高效关联容器全解析》
  • 具有熔断能力和活性探测的服务负载均衡解决方案
  • Linux编程 IO(标准io,文件io,目录io)
  • 机器学习⑤【线性回归(Linear Regression】
  • springboot接口请求参数校验
  • web开发,在线%射击比赛管理%系统开发demo,基于html,css,jquery,python,django,三层mysql数据库
  • 锂电池自动化生产线:智能制造重塑能源产业格局
  • 【完整源码+数据集+部署教程】医学报告图像分割系统源码和数据集:改进yolo11-HGNetV2
  • 深度学习与遥感入门(七)|CNN vs CNN+形态学属性(MP):特征工程到底值不值?
  • 【工具】雀语queyu文件批量下载 文档内容复刻导出
  • Socket 套接字的学习--UDP
  • wps--设置
  • 大模型推理框架vLLM 中的Prompt缓存实现原理
  • GaussDB 权限管理的系统性技术解析与实践指南
  • Windows 系统 上尝试直接运行 .sh(Shell 脚本)文件
  • OpenFeign 服务调用原理与源码分析
  • Endnote 20超详细入门教程(实现参考论文的插入)
  • 类和对象(中下)
  • ARM芯片架构之CoreSight Channel Interface 介绍
  • 机器学习-Cluster
  • 机器学习——svm支持向量机
  • mac下载maven并配置,以及idea配置