pytorch的tensor处理速查表
转载自:https://www.pythonf.cn/read/147307
目录
前言
本文内容基于pytorch 1.6版本进行学习,记录下pytorch在实际场景中常用的API以备编程时查阅。
本文大量参考借鉴了B站视频 《PyTorch学这个就够了》 ,侵删。
pytorch开发环境配置请参考 pytorch安装 CUDA安装
以下API都会将计算结果作为返回值,而不对原数据做修改,如需在原数据上产生修改,可在方法名末尾加下划线(如果方法存在)
1. 创建张量(tensor)
a.shape
a.size()
返回张量a的形状,返回值为张量类型torch.from_numpy(numpy数组)
返回numpy数组转化而来的张量,内存共享torch.tensor([1,2,3,4,5])
定义张量,数值指定torch.FloatTensor(4,3,6)
返回4×3×6大小的Float型张量,数值不初始化(随机)。也可填列表torch.Tensor(4,3,6)
同上,默认FloatTensortorch.set_default_tensor_type(torch.DoubleTensor)
修改默认Tensor(即上一条),但参数只能是实数类型torch.ones(3,4)
返回3×4的全1张量torch.zeros(3,4)
返回3×4的全0张量torch.eye(3,3)
返回3×3的单位矩阵张量,只能二维torch.full([3,4],7,dtype=int)
返回3×4的全7张量torch.arange(0,10)
或 torch.arange(0,10,2)
前者返回[0,10)一维tensor,后者返回tensor([0,2,4,6,8])torch.linspace(0,10,steps=4)
返回一维tensor([ 0.00, 3.33, 6.67, 10.00]),长度为steps,间距相等torch.logspace(0,1,steps=4)
返回一维tensor([ 1.00, 2.15, 4.64, 10.00]), f i = 1 0 x f_i=10^x f i= 1 0 x , x x x 等距分布在[0,1]torch.randperm(10)
返回0到9这10个整数的一维乱序张量torch.rand(3,4)
返回3×4张量,数值服从[0,1]均匀分布torch.randn(3,4)
返回3×4张量,数值服从标准正态分布torch.rand_like(a)
返回与a同shape的张量,数值服从[0,1]均匀分布torch.randint(1,10, [3,4])
返回3×4的张量,数值从[1,10)随机选取torch.normal(mean=,std=)
返回服从正态分布的张量。 mean和std均为张量 (形状一致),输出张量每个元素服从每一对(mean,std)正态分布
2. 比较大小 & bool张量快速判断
1. 以下5个函数要么 x
与 y
形状相同,对应元素比较;要么 y y y 是数字, x
元素逐一与 y y y 比较。 返回值均为与 x
同形状的bool张量 。
x.ge(y)
等价于 x>=y
x.le(y)
等价于 x<=y
x.gt(y)
等价于 x>y
x.lt(y)
等价于 x<y
x.eq(y)
等价于 x==y
2. 以下函数返回值为 True
或 False
x.equal(y)
张量 x x x 与 y y y 必须同形状。 x x x 与 y y y 对应元素相等时返回 True
torch.all(mask)
若bool张量 mask
全为 True
,返回 True
;否则返回 False
torch.any(mask)
若bool张量 mask
存在 True
,返回 True
;否则返回 False
3. 索引与切片
假设 a=torch.rand(4,3,28,28)
,表示4张图片,每个图片3个channel,每个channel是28×28图片a[0,0,2,4]
每个维度指定索引,返回确切的元素值a[:2]
仅在第0个维度上,截取第0到2(不含)张照片, 内存共享,下同a[0:2, :, :, -1:]
第0个维度同上,第1,2维度上全取,第3维度上取最后一个。中间连续 :
可用 ...
代替a[:, :, 0:10:3]
第0,1维度上全选。第2维度上从0到10步长为3选取,效果同range(0,10,3)a.index_select(0, torch.tensor([0,2]))
第0维度上,选择第0,2张图片。 内存不共享,返回复制体,下同a.masked_select(mask)
a[mask]
bool张量 mask
与 a
同形状,抽取 a
中对应 mask
位置为 True
的元素,返回一维张量a.take(indices)
把 a
看作一维,抽出一维张量 indices
指定位置的元素,返回一维张量
4. 维度变换
1. 假设张量 a
的形状为 (1,4,3,1)
, b
的形状为 (2,3)
a.view(3,4)
返回张量 a
形状为3×4的形式,参数填-1则自动计算。 内存共享a.squeeze(0)
若第0维度是 1
,则删掉这个维度;否则不变。实际数据不变。 内存共享,下同a.unsqueeze(0)
与 squeeze
相反,增加第0维度,大小是 1
a.expand(4,-1,-1,-1)
,第0维度“复制”为4份,其他维度不变。“复制”只能是大小为 1
的维度。 内存共享a.repeat(4,-1,-1,-1)
功能同 expand
。但 repeat
是深拷贝,而 expand
的“复制”是 共享内存
2. 下面3个转置,原内存中的数据会发生变化,不再连续,可执行 contiguous()
获得连续形式。
b.t()
返回 二维 张量 b
的转置a.transpose(0,2)
在第0和2维度上进行转置a.permute(2,1,0,3)
多维度转置。如第2维度转到第0维度
5. 拼接与拆分
假设张量 a
的形状为 (4,3,2)
, b
的形状为 (4,3,2)
torch.cat([a,b],dim=0)
在第0维度上 拼接 a
与 b
,返回形状 (8,3,2)
。需保证除第 dim
维外,形状相同torch.stack([a,b],dim=1)
在第1维度上 组合 a
与 b
,返回形状 (4,2,3,2)
。需保证 a
与 b
形状完全相同
a.split(split_sizes=1,dim=0)
在第 dim
维度上拆分,每份大小为 split_sizes
。与 cat()
互为反操作a.split([1,2,1],dim=0)
在第 dim
维度上拆分,每份大小对应 split_sizes
每个元素。
a.chunk(chunks=4,dim=3)
在第 dim
维度上拆分,平均分为 chunks
份。
6. 基本运算
a.add(b)
a+b
a.sub(b)
a-b
a.mul(b)
a*b
对应元素相乘a.div(b)
a/b
其中 b
不能是整数类型x.mm(y)
矩阵乘法,x和y必须均为二维x.matmul(y)
x@y
矩阵乘法a.pow(2)
a**2
求张量每个元素的n次方a.sqrt()
求张量每个元素的平方根。square roota.rsqrt()
在 sqrt()
基础上对每个元素取倒数a.exp()
对每个元素 x x x ,求 e x e^x e xa.log()
对每个元素 x x x ,求 l n x ln x l n x ,即以 e e e 为底的对数a.floor()
对每个元素向下取整a.ceil()
对每个元素向上取整a.trunc()
对每个元素取整数部分a.frac()
对每个元素取小数部分a.round()
对每个元素四舍五入,返回类型为 torch.FloatTensor
a.clamp(1,3)
小于1的元素改为1,大于3的元素改为3。第二参数不填则不限制。 内存深拷贝
7. 数据统计
1. 下面前9个函数均含有默认参数 dim=None, keepdim=False
。若指定 dim
,则在第dim维度上分别操作,且可以指定 keepdim=True
保持维度;不指定 dim
将对所有元素操作,返回标量。a.max()
最大值a.min()
最小值a.median()
中位数,偶数个元素时取左中值a.sum()
求和a.mean()
均值a.prod()
累乘a.argmax()
最大值的索引,多个最大值时返回最大索引a.argmin()
最小值的索引,多个最小值时返回最大索引a.norm(p=,dim=None,keepdim=False)
求张量第 dim
维的第 p
范数,即 ∑ i x i p p \sqrt[p]{\sum_i x_i^p} p ∑ ix i p
b.topk(k=, dim=None, largest=True, sorted=True)
在第 dim
维度上求前k大( largest=False
则前k小), dim
默认最低维度b.kthvalue(k=,dim=None,keepdim=False)
在第 dim
维度上求第k小, dim
默认最低维度
8. 复杂操作
torch.where(condition,x,y)
三个参数为同形状张量, o u t ( i ) = { x i , i f ( c o n d i t i o n i i s T r u e ) y i , o t h e r w i s e out(i)=\begin{cases}x_i, & if (condition_i \; is \; True) \\ y_i, & otherwise\end{cases} o u t ( i ) = { x i, y i,i f ( c o n d i t i o n ii s T r u e ) o t h e r w i s etorch.gather(a,dim=,index=)
张量 a
和 index
的形状必须在同一维度空间中。从第 dim
维度看 index
,抽取 a
中第 dim
维度对应的那个位置的元素。返回张量与 index
形状相同