得到一个值。
得到一个向量。
a=torch.tensor([1,2,3])
b=torch.tensor([2,3,4])
print(torch.dot(a,b))
print(torch.cross(a,b))
# tensor(20)
# tensor([-1, 2, -1])
1. 二维矩阵乘法 torch.mm()
torch.mm(mat1, mat2, out=None)
2. 三维带batch的矩阵乘法 torch.bmm()
由于神经网络训练一般采用mini-batch,经常输入的时三维带batch的矩阵,所以提供
torch.bmm(bmat1, bmat2, out=None)
一般用的比较少,仅仅是模型一个batch训练的时候使用。
3. 多维矩阵乘法 torch.matmul()
torch.matmul(input, other, out=None)
支持broadcast操作,一般矩阵乘法,推荐使用这个matmul。针对多维数据 matmul() 乘法,可以认为该乘法使用使用两个参数的后两个维度来计算,其他的维度都可以认为是batch维度。假设两个输入的维度分别是input(1000×500×99×11), other
(500×11×99)那么我们可以认为torch.matmul(input, other, out=None)
乘法首先是进行后两位矩阵乘法得到(99×11)×(11×99) ⇒(99×99) ,然后分析两个参数的batch size分别是 (1000×500) 和( 500x1) , 可以广播成为(1000×500), 因此最终输出的维度是(1000×500×99×99)。
4. 矩阵逐元素(Element-wise)乘法 torch.mul()
torch.mul(mat1, other, out=None)
其中 other 乘数可以是标量,也可以是任意维度的矩阵, 只要满足最终相乘是可以broadcast的即可。
5. dot 函数
对于秩为1的数组,执行对应位置相乘,然后再相加,等价于向量的点乘;
对于秩不为1的二维数组,执行矩阵乘法运算,等价于矩阵的叉乘;
6. * 和 @
* 代表的是矩阵逐元素乘
@ 代表的是 矩阵乘法
x=torch.tensor([[1,2],[3,4]])
y=torch.tensor([[1,2],[3,4]])
print(x*y)
print(x@y)
# tensor([[ 1, 4],
# [ 9, 16]])
# tensor([[ 7, 10],
# [15, 22]])
1. 把向量 看成 1*n 的矩阵,不过需要采用 unsqueeze() 函数来增加一下维度。
转置的话 ,一般采用 a.t() 或者 a.transpose(0,1)
2. 矩阵点乘 用 torch.mul
3. 矩阵乘法 用 torch.matmul
import torch
a=torch.tensor([1,2,3]) # 1*3
c=torch.tensor([[1,2,3],[4,5,6]]) # 2*3
print(torch.mul(a,c))
print(torch.matmul(c,a))
#tensor([[ 1, 4, 9],
# [ 4, 10, 18]])
#tensor([14, 32])