torch.mul() 、 torch.mm() 及torch.matmul()的区别

1、torch.mul(a, b)是矩阵a和b对应位相乘,a和b的维度必须相等,比如a的维度是(1, 2),b的维度是(1, 2),返回的仍是(1, 2)的矩阵。
torch.mul() 、 torch.mm() 及torch.matmul()的区别_第1张图片

2、torch.mm(a, b)是矩阵a和b矩阵相乘,比如a的维度是(1, 2),b的维度是(2, 3),返回的就是(1, 3)的矩阵。限定二维,且不支持广播。
torch.mul() 、 torch.mm() 及torch.matmul()的区别_第2张图片
torch.mul() 、 torch.mm() 及torch.matmul()的区别_第3张图片
上图错误在于,高维矩阵(二维以上)不能使用mm,应使用matmul。三维时,可以使用bmm。如下图所示:
torch.mul() 、 torch.mm() 及torch.matmul()的区别_第4张图片

3、 torch,matmul(a,b),操作取决于张量的维度。
a. 如果两个张量都是一维的,则返回点积(标量)。
torch.mul() 、 torch.mm() 及torch.matmul()的区别_第5张图片

b. 如果两个参数都是二维的,则返回矩阵积。
torch.mul() 、 torch.mm() 及torch.matmul()的区别_第6张图片

c. 如果第一个参数是一维的,第二个参数是二维的,那么为了矩阵相乘,在其维数前面加上1。在矩阵相乘之后,前面的维度被移除。
torch.mul() 、 torch.mm() 及torch.matmul()的区别_第7张图片
d. 如果第一个参数是二维的,第二个参数是一维的,则返回矩阵向量积。
torch.mul() 、 torch.mm() 及torch.matmul()的区别_第8张图片
附上矩阵向量积的原理:左行右列
torch.mul() 、 torch.mm() 及torch.matmul()的区别_第9张图片

e. 如果两个参数都至少是一维的,并且至少有一个参数是N维的(其中N>2),则返回一个成批矩阵乘法。如果第一个参数是一维的,则为了成批矩阵相乘的目的,在其维数前面加一个1,然后将其删除。如果第二个参数是一维的,则为了成批矩阵的倍数,在其维数后附加一个1,并在其后删除。非矩阵(即批处理)维度是广播的(因此必须是可广播的)。例如,如果输入是(j×1×n×n)(j×1×n×n)张量,另一个是(k×n×n)(k×n×n)张量,则输出将是(j×k×n×n)(j×k×n×n)张量。
注意,在确定输入是否可广播时,广播逻辑只查看批处理维度,而不查看矩阵维度。例如,如果输入是(j×1×n×m)(j×1×n×m)张量,而另一个是(k×m×p)(k×m×p)张量,则即使最后两个维度(即矩阵维度)不同,这些输入也可用于广播。out将是(j×k×n×p)(j×k×n×p)张量。
这个我也没看太懂,附上官方文档,以后需要的时候再说吧!
torch.mul() 、 torch.mm() 及torch.matmul()的区别_第10张图片

你可能感兴趣的:(pytorch,神经网络,机器学习)