Pytorch对Tensor的各种“特别”操作

经过一段时间的Pytorch使用,发现提供的Tensor类型中大部分操作都很好理解,比如各种数学操作(abs,add,asin,mul,div)和它们组成的复合操作(addcdiv,addcmul)等。
下面将对于写代码时,我遇到的一些常用的“特殊”操作,总结mark下:

clamp 截断

用来“截断”tensor,使每个元素都保持在min~max范围内

torch.clamp(input,min,max,out=None)

cat 合并

沿着第dim维度将seq中的tensor合并成一个tensor

torch.cat(seq,dim=0,out=None)

chunk 分块

按照第dim维,将tensor分成chunks块(如果不能整除的话,则最后一块会略小,比如该维度为3则分成2和1)

torch.chunk(tensor,chunks,dim=0)

gather 聚合

将input的tensor,按照第dim的引索index重新聚合,这个不太好直接理解,所以上图说明,c按照第1维为标准(按照行看),所以所以聚合后的index,代替原来第1维上index第一行的引索由(0,1)变为(0,0)所以得到了新行[0,0],依此类推下面两行。
d按照第0维为标准(按照列看),第一列引索变为(0,1,1),所以得到了新列[0,2,2]

torch.gather(input, dim, index, out=None) 

Pytorch对Tensor的各种“特别”操作_第1张图片

squeeze 压缩

对于tensor来说,可能存在某个维度上的大小为1,比如tensor a的shape为[2,1,1,2,2],那么对它使用squeeze后,将压缩所有大小为0的维度使他的shape变为[2,2,2]。如果指定了dim则指处理该维度,比如dim=0,则保持不变,因为该维度大小不为1,反之指定dim=2时,由于该维度大小为1,则压缩为[2,1,2,2]

torch.squeeze(input,dim=None,out=None)

unsqueeze 反压缩

和squeeze相反,用来添加维度,必须指定dim,添加到第dim维上

torch.unsqueeze(input,dim=None,out=None)

permute 重排序

这个常用与调整图像tensor,如输入图像数据为(n,224,224,3),
实际pytorch中网络需要接受(n,3,224,224)的图像,就可以使用permute 调整维度顺序。其中dim*接受改变后各维度顺序的参数,比如[0,3,1,2]即可将最后一个维度提到前面。

torch.tensor.permute(dim*)

pading 填充

使用nn.ConstantPad2d,前面tuple里的四个参数左右上下的填充大小,最后指定填充的值。

self.pad = nn.ConstantPad2d((0, 1, 0, 1), 0)

余弦相似度

利用pytorch提供的torch.nn.CosineSimilarity函数,但是该函数只接受shape相同的tensor,所以对于shape不同的tensor,需要通过unsqueeze和expand处理成相同的shape。

cos = torch.nn.CosineSimilarity(dim=2, eps=1e-6)

def cos_dist(x, y):
    # x: N x D
    # y: M x D
    n = x.size(0)
    m = y.size(0)
    d = x.size(1)
    assert d == y.size(1)

    x = x.unsqueeze(1).expand(n, m, d)
    y = y.unsqueeze(0).expand(n, m, d)
    

    return -cos(x,y)

未完待续~

你可能感兴趣的:(pytorch)