torch.mm是两个矩阵相乘,即两个二维的张量相乘
如下面的例子
mat1 = torch.randn(2,3)
print("mat1=", mat1)
mat2 = torch.randn(3,2)
print("mat2=", mat2)
mat3 = torch.mm(mat1, mat2)
print("mat3=", mat3)
但是如果维度超过二维,则会报错。RuntimeError: self must be a matrix
它其实就是加了一维batch,所以第一位为batch,并且要两个Tensor的batch相等。
第二维和第三维就是mm运算了,同上了。
示例代码如下:
mat1 = torch.randn(10, 2, 4)
# print("mat1=", mat1)
mat2 = torch.randn(10, 4, 1)
# print("mat2=", mat2)
mat3 = torch.matmul(mat1, mat2)
print("mat3=", mat3, mat3.shape)
torch.mm仅仅是供矩阵相乘使用,使用范围较为狭窄。
而torch.matmul使用的场合就比较多了。
如官方文档所介绍,有如下几种:
mat1 = torch.Tensor([1,2])
print("mat1=", mat1)
mat2 = torch.Tensor([1,2])
print("mat2=", mat2)
mat3 = torch.matmul(mat1, mat2)
print("mat3=", mat3)
公式如下:
A = [ a 1 , a 2 , . . . , a n ] B = [ b 1 , b 2 , . . . , b n ] m a t m u l ( A , B ) = ∑ i a i b i A=[a_1,a_2 ,..., a_n] \newline B=[b_1,b_2 ,..., b_n] \newline matmul(A,B)=\sum_{i}a_ib_i A=[a1,a2,...,an]B=[b1,b2,...,bn]matmul(A,B)=i∑aibi
If both arguments are 2-dimensional, the matrix-matrix product is returned.
如果两个都是二维的,那么就如同torch.mm
If the first argument is 1-dimensional and the second argument is 2-dimensional, a 1 is prepended to its dimension for the purpose of the matrix multiply. After the matrix multiply, the prepended dimension is removed.
如果第一个入参是一维的,第二个入参是二维的,则第一个参数增加一个一维,做矩阵乘法,结果然后去掉一维
如, 第一参数A shape为(2),第二参数B shape(2,2),
先讲A增加一维,shape为(1,2),然后计算矩阵相乘
结果为(1,2),再去掉第一维,改为(2)
代码样例如下:
mat1 = torch.Tensor([1,-1])
print("mat1=", mat1)
mat2 = torch.Tensor([[1,2],[-1,-2]])
print("mat2=", mat2)
mat3 = torch.matmul(mat1, mat2)
print("mat3=", mat3, mat3.shape)
如, 第一参数A shape为(2,2),第二参数B shape(2),
先将B增加一维,shape为(2,1),然后计算矩阵相乘
结果为(2,1),再去掉第一维,改为(2)
代码样例如下:
mat1 = torch.Tensor([[1,2],[-1,-2]])
print("mat1=", mat1)
mat2 = torch.Tensor([1,-1])
print("mat2=", mat2)
mat3 = torch.matmul(mat1, mat2)
print("mat3=", mat3, mat3.shape)
但是要注意:
相对numpy,有类似函数tensordot,具体可以参考我这一篇,但是个人觉得还是numpy的实现更灵活一些