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>=yx.le(y) 等价于 x<=yx.gt(y) 等价于 x>yx.lt(y) 等价于 x<yx.eq(y) 等价于 x==y
2. 以下函数返回值为 True 或 False
x.equal(y) 张量 x x x 与 y y y 必须同形状。 x x x 与 y y y 对应元素相等时返回 Truetorch.all(mask) 若bool张量 mask 全为 True ,返回 True ;否则返回 Falsetorch.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维度,大小是 1a.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+ba.sub(b) a-ba.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.FloatTensora.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 形状相同
浙公网安备 33010602011771号