pytorch中unsqueeze用法小结
作者:ym62033
在指定的位置插入一个维度,有两个参数,input是输入的tensor,dim是要插到的维度
需要注意的是dim的范围是[-input.dim()-1, input.dim()+1),是一个左闭右开的区间,当dim为负值时,会自动转换为dim = dim+input.dim()+1,类似于使用负数对python列表进行切片。
import torch a = torch.randn(2,5) print(a) print("") b = a.unsqueeze(0) print(b.shape) print("") c = a.unsqueeze(a.dim()) print(c.shape) 输出: tensor([[-0.4734, 0.4115, -0.9415, -1.1280, -0.1065], [ 0.1613, 1.2594, 1.1261, 1.3881, 0.1112]]) torch.Size([1, 2, 5]) torch.Size([2, 5, 1])
以上是二维数据情况:
首先生成了一个二维矩阵,其大小为[2,5]
然后,在0维度上插入一个维度,可以看到现在新矩阵a的形状变为[1,2,5],第0维度的大小默认是1
最后,在最后一个维度上插入一个维度,形状变为[2, 5, 1]
a=torch.rand(2,3,2) print("") print("torch.unsqueeze(a,3) size: {}".format(torch.unsqueeze(a,3).size())) print("") print("torch.unsqueeze(a,2) size: {}".format(torch.unsqueeze(a,2).size())) print("") print("torch.unsqueeze(a,1) size: {}".format(torch.unsqueeze(a,1).size())) print("") print("torch.unsqueeze(a,0) size: {}".format(torch.unsqueeze(a,0).size())) print("") print("torch.unsqueeze(a,-1) size: {}".format(torch.unsqueeze(a,-1).size())) print("") print("torch.unsqueeze(a,-2) size: {}".format(torch.unsqueeze(a,-2).size())) print("") print("torch.unsqueeze(a,-3) size: {}".format(torch.unsqueeze(a,-3).size())) print("") print("torch.unsqueeze(a,-4) size: {}".format(torch.unsqueeze(a,-4).size())) 输出: torch.unsqueeze(a,3) size: torch.Size([2, 3, 2, 1]) torch.unsqueeze(a,2) size: torch.Size([2, 3, 1, 2]) torch.unsqueeze(a,1) size: torch.Size([2, 1, 3, 2]) torch.unsqueeze(a,0) size: torch.Size([1, 2, 3, 2]) torch.unsqueeze(a,-1) size: torch.Size([2, 3, 2, 1]) torch.unsqueeze(a,-2) size: torch.Size([2, 3, 1, 2]) torch.unsqueeze(a,-3) size: torch.Size([2, 1, 3, 2]) torch.unsqueeze(a,-4) size: torch.Size([1, 2, 3, 2])
对于三维数据input.dim() = 3,因此dim的范围是[-4, 4)
torch.squeeze() 和 torch.unsqueeze()区别
第一块:
squeeze(),主要是对数据的维度进行压缩,去掉元素数为1的那个维度,使用方式:a.squeeze(N) or torch.squeeze(a,N) ,去掉a的第N维度,以此来实现数据a的维度压缩;
unsqueeze()与squeeze()函数功能相反,其功能是对数据维度进行扩充,使用方式:a.unsqueeze(N) or torch.unsqueeze(a,N),在数据a的第N维度上增加一个维数为1的维度,以此实现对数据的扩充,方便后续模型训练喂入模型的数据的维度和模型接收数据的维度是匹配的。
第二块:
device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu") model.to(device) # 选择第0个cuda
model.to(device)
以上两行代码放在读取数据之前。
mytensor = my_tensor.to(device) #将所有最开始读取数据时的tensor变量copy一份到device所指定的GPU上,之后运算都在指定的GPU上进行。这些tensor多是最开始读取数据时的变量,后面其衍生出的新变量也会在已指定的GPU上运行计算。
第三块:
Tensor & Numpy 都是矩阵,区别在与Tensor可以在GPU上运行,Numpy只能在CPU上运行。(天呐,我现在才知道!)Tensor与Numpy互相转化很方便,类型也比较兼容,Tensor可以直接通过print显示数据类型,而Numpy不可以。
第四块:
x.aadd(y) 实现x与y Tensor的相加,不改变x,返回一个新的Tensor
x.add_(y) 实现x与y Tensor的相加,会修改x的维数
到此这篇关于pytorch中unsqueeze用法小结的文章就介绍到这了,更多相关pytorch unsqueeze内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!