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) 同上,默认FloatTensor
torch.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 ix , 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个函数要么 与 形状相同,对应元素比较;要么 y y y 是数字, 元素逐一与 y y y 比较。 返回值均为与 同形状的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 与 同形状,抽取 中对应 mask 位置为 True 的元素,返回一维张量
a.take(indices) 把 看作一维,抽出一维张量 indices 指定位置的元素,返回一维张量

4. 维度变换

1. 假设张量 的形状为 (1,4,3,1) , 的形状为 (2,3)

a.view(3,4) 返回张量 形状为3×4的形式,参数填-1则自动计算。 内存共享
a.squeeze(0) 若第0维度是 ,则删掉这个维度;否则不变。实际数据不变。 内存共享,下同
a.unsqueeze(0) 与 squeeze 相反,增加第0维度,大小是 1
a.expand(4,-1,-1,-1) ,第0维度“复制”为4份,其他维度不变。“复制”只能是大小为 的维度。 内存共享
a.repeat(4,-1,-1,-1) 功能同 expand 。但 repeat 是深拷贝,而 expand 的“复制”是 共享内存

2. 下面3个转置,原内存中的数据会发生变化,不再连续,可执行 contiguous() 获得连续形式。

b.t() 返回 二维 张量 的转置
a.transpose(0,2) 在第0和2维度上进行转置
a.permute(2,1,0,3) 多维度转置。如第2维度转到第0维度

5. 拼接与拆分

假设张量 的形状为 (4,3,2) , 的形状为 (4,3,2)

torch.cat([a,b],dim=0) 在第0维度上 拼接 与 ,返回形状 (8,3,2) 。需保证除第 dim 维外,形状相同
torch.stack([a,b],dim=1) 在第1维度上 组合 与 ,返回形状 (4,2,3,2) 。需保证 与 形状完全相同

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 其中 不能是整数类型
x.mm(y) 矩阵乘法,x和y必须均为二维
x.matmul(y) x@y 矩阵乘法
a.pow(2) a**2 求张量每个元素的n次方
a.sqrt() 求张量每个元素的平方根。square root
a.rsqrt() 在 sqrt() 基础上对每个元素取倒数

a.exp() 对每个元素 x x x ,求 e x e^x x
a.log() 对每个元素 x x x ,求 l n x ln x 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 维的第 范数,即 ∑ i x i p p \sqrt[p]{\sum_i x_i^p} ∑ ip

2. 以下函数返回两个张量,分别是截取出来数据 和 每个元素的索引。

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} ii,ie
torch.gather(a,dim=,index=) 张量 和 index 的形状必须在同一维度空间中。从第 dim 维度看 index ,抽取 中第 dim 维度对应的那个位置的元素。返回张量与 index 形状相同

 

posted @ 2021-08-17 14:16  鲍曼小学生  阅读(606)  评论(0编辑  收藏  举报