pytorch
2使用torch.xx_like()创建张量
torch.ones_like(X), torch.zeros_like(X), torch.rand_like(X)可以分别用于创建一个与张量X具有相同维度的全1、全0或者是服从[0,1]区间上均匀分布的张量。
3、随机数生成张量
torch.normal(mean, std)可以通过传入指定的均值张量和标准差张量,从而生成一个对应满足该分布的随机数张量,当mean和std传入多个值时,则会相应得到多个随机数张量。均值和方差向量的维度需要满足广播机制。 torch.rand(shape), torch.randn(shape)则是用于生成服从[0,1]区间上均匀分布的张量以及服从标准正态分布的张量。
4、按照数值内容创建张量
torch.zeros(shape),torch.ones(shape),torch.eye(shape),torch.full(shape, fill_value),torch.empty(shape)可以通过指定shape来创建一个全0、全1、全为fill_value或是完全随机的一个张量。
import torch
import torch print("全0张量:",torch.zeros(5,2)) print("全1张量:",torch.ones(5,2)) print("对角线全1,其余部分全0张量:",torch.eye(5,5)) print("5行2列全为3的张量:",torch.full((5,2),3)) print("完全随机任意数据类型的张量:",torch.empty(5,3)) ********************************************** 全0张量: tensor([ [0., 0.], [0., 0.], [0., 0.], [0., 0.], [0., 0.]]) 全1张量: tensor([ [1., 1.], [1., 1.], [1., 1.], [1., 1.], [1., 1.]]) 对角线全1,其余部分全0张量: tensor([ [1., 0., 0., 0., 0.], [0., 1., 0., 0., 0.], [0., 0., 1., 0., 0.], [0., 0., 0., 1., 0.], [0., 0., 0., 0., 1.]]) 5行2列全为3的张量: tensor([[3, 3], [3, 3], [3, 3], [3, 3], [3, 3]]) 完全随机任意数据类型的张量: tensor( [9.9184e-39, 1.0561e-38, 7.3470e-39], [1.0653e-38, 1.0194e-38, 4.6838e-39], [8.4489e-39, 9.6429e-39, 8.4490e-39], [9.6429e-39, 9.2755e-39, 1.0286e-38], [9.0919e-39, 8.9082e-39, 9.2755e-39]])
5、按照某种规则生成张量
torch.arange(start, end, step), torch.linspace(start, end, step), torch.logspace(start, end, step)可以通过指定start,end以及step参数来在某个范围内基于固定步长、等长间隔或对数间隔的张量。
print("初始值为0,终止值为5,步长为1的的张量:",torch.arange(5)) print("初始值为2,终止值为20,步长为3的的张量:",torch.arange(2,20,3)) print("在区间2和17上均匀间隔的5个点的张量:",torch.linspace(2,17,5)) print("对数均分的 1 维张量:",torch.logspace(0,3,4)) print("对数均分的 1 维张量:",torch.logspace(2,10,5)) # 对数底默认为102 ************************************************** 初始值为0,终止值为5,步长为1的的张量: tensor([0, 1, 2, 3, 4]) 初始值为2,终止值为20,步长为3的的张量: tensor([ 2, 5, 8, 11, 14, 17]) 在区间2和17上均匀间隔的5个点的张量: tensor([ 2.0000, 5.7500, 9.5000, 13.2500, 17.0000]) 对数均分的 1 维张量: tensor([ 1., 10., 100., 1000.]) 对数均分的 1 维张量: tensor([1.0000e+02, 1.0000e+04, 1.0000e+06, 1.0000e+08, 1.0000e+10])一般常用的就是32位浮点型,而且只有浮点型才可以计算梯度。训练用的标签则一般是整型中的32或64位。 我们可以使用tensor.dtype来查看当前tensor的数据类型。
1、改变张量形状
tensor.reshape(shape), torch.reshape(input, shape), tensor.resize_(shape), tensor.view(shape) 可以根据指定的shape对原tensor进行reshape操作。
- 在PyTorch中,以“_”结尾的函数操作一般表示原地操作,直接对原tensor进行操作。
- torch.reshape和tensor.view都可以用来调整tensor的形状,但view函数要求作用的tensor在内存中连续存储,如果对tensor调用过transpose,permute等操作后就无法直接使用view,而需要使用tensor.contiguous来获得一个连续的copy,而reshape则没有这个要求
2、改变张量维度
- torch.unsqueeze(tensor, dim)可以在张量的指定维度插入一个新的维度,得到一个新的张量,也可以使用tensor.unsqueeze_(dim)进行原地操作。一般是用于给灰度图扩展维度使用,灰度图倘若使用灰度方式读取的话,最终得到的shape为B, H, W,是不符合PyTorch四个维度的要求的,此时可以使用tensor.unsqueeze_(dim=1)来扩充一个维度,得到的新tensor的shape为B, 1, H, W即可进行后续操作了。
- torch.squeeze(tensor, dim)功能则正好相反,它可以移除指定或者所有维度大小为1(不指定维度时)的维度,从而得到一个维度减小的新张量,类似的也可以使用tensor.squeeze_(dim)进行原地操作。一般用于全卷积网络做分类时的多余维度压缩用,在使用全卷积网络得到最后分类的时(shape为B, C, H, W, C即为待分类数),此时使用Global Average Pooling对特征图的空间信息进行压缩和进一。
- 步提取,得到feature map的shape为B, C, 1, 1,此时即可使用tensor.squeeze_()对维度进行压缩,得到shape为B, C的分类向量,即可用于后续loss计算