写在开头:
有一篇大佬的总结非常到位:博客
tensor.contiguous()
时,会开辟新的内存空间,存放内存连续的数据。返回当前张量在某维扩展更大后的张量。扩展(expand)张量不会分配新的内存,只是在存在的张量上创建一个新的视图(view),一个大小等于1的维度扩展到更大的尺寸
例子:
import torch
x = torch.tensor([1, 2, 3])
x.expand(2,3)
tensor([[1, 2, 3],
[1, 2, 3]])
注意 expand()只能扩展维度为1的维数,维数不为1的部分要保持一致
沿着特定的维度重复这个张量,和expand()不同的是,这个函数拷贝张量的数据
例子
import torch
x = torch.tensor([1, 2, 3])
x.repeat(3,2)
tensor([[1, 2, 3, 1, 2, 3],
[1, 2, 3, 1, 2, 3],
[1, 2, 3, 1, 2, 3]])
x2 = torch.randn(2, 3, 4)
x2.repeat(2, 1, 3).shape
torch.Tensor([4, 3, 12])
pytorch中的乘法操作有:torch.mm(), torch.bmm(), torch.matmul(), torch.mul(), 运算符,以及torch.einsum()
该函数一般只用来计算两个二维矩阵的矩阵乘法,并且不支持broadcast操作。
torch.mm(mat1, mat2, out=None), 其中mat1为(nxm),mat2为(mxd),输出维度是(nxd)
该函数的两个输入必须是三维矩阵且第一维相同(表示Batch维度),不支持broadcast操作。
由于神经网络训练一般采用mini-batch,经常输入的三维带batch的矩阵,所以提供torch.bmm(bmat1, bmat2, out=None)
,其中bmat1
为(bxnxm),bmat2
为(bxmxd),输出out
的维度是(bxnxd)
torch,matmul(input, other, out=None)支持broadcast操作
针对多维数据matmul()
乘法,可以认为该matmul()
乘法使用两个参数的后两个维度计算,其他的维度都可以认为是batch维度。假设两个输入的维度分别为input->(100x500x99x11)
,other->(500x11x99)
那么我们可以认为该乘法首先进行后两位矩阵乘法得到(99x11)x(11x99)->(99,99)
,然后分析两个参数的batch size分别为(1000x500)
和500
,可以广播为(1000x500)
,因此最终输出的维度是(1000x500x99x99)
函数torch.mul(mat1, other, out=None)
,其中other乘数可以是标量,也可以是任意维度的矩阵,只要满足最终相乘是可以broadcast即可。