torch.view torch.expand
1 原始
tensor维度: [41]
torch.arange(*self.grid_conf['dbound'], dtype=torch.float)
2 torch.view
tensor维度:[41,1,1] 第2,3个维度为110单数维
torch.arange(*self.grid_conf['dbound'], dtype=torch.float).view(-1, 1, 1)
知识点:
①view(new_shape)将张量修改为指定形状,但要保持新张量和原张量在数量上一致。
②view中一个参数定为-1,代表自动调整这个维度上的元素个数,以保证元素的总数不变。
例如:
B,C,H,W=x.size()
# 合并HW
x=x.view(B,-1,C)或者x=x.view(B,H*W,C)
3 torch.expand
tensor维度:[41,8,22]
torch.arange(*self.grid_conf['dbound'], dtype=torch.float).view(-1, 1, 1).expand(-1, feat_H16, feat_W16)
知识点:
expand函数用于将张量中单数维
的数据扩展到指定的size
。
首先解释下什么叫单数维(singleton dimensions)
,张量在某个维度上的size为1,则称为单数维。比如zeros(2,3,4)不存在单数维
,而zeros(2,1,4)在第二个维度(即维度1)上为单数维
。expand函数仅仅能作用于这些单数维
的维度上。
参数*sizes用于逐个指定各个维度扩展后的大小(也可以理解为拓展的次数),对于不需要或者无法(即非单数维)进行扩展的维度,对应位置可写上原始维度大小或直接写作-1
。
expand函数可能导致原始张量的升维,其作用在张量前面的维度上,因此通过expand函数可将张量数据复制多份(可理解为沿着第一个batch的维度上)。
另一个值得注意的点是:expand函数并不会重新分配内存,返回结果仅仅是原始张量上的一个视图。
下面为几个简单的示例:
import torch
a = tensor([1, 0, 2])
b = a.expand(2, -1) # 第一个维度为升维,第二个维度保持原阳
# b为 tensor([[1, 0, 2], [1, 0, 2]])a = torch.tensor([[1], [0], [2]])
b = a.expand(-1, 2) # 保持第一个维度,第二个维度只有一个元素,可扩展
# b为 tensor([[1, 1],
# [0, 0],
# [2, 2]])
不修改值,只用于计算,尽量用 expand,否则用 repeat。