Python 2D乘以2D等于3d pytorch张量
给定两个二维pytorch张量:Python 2D乘以2D等于3d pytorch张量,python,pytorch,matrix-multiplication,Python,Pytorch,Matrix Multiplication,给定两个二维pytorch张量: A=torch.FloatTensor([[1,2],[3,4]) B=火炬.浮标张量([[0,0],[1,1],[2,2]] 是否有一种有效的方法来计算形状张量(6,2,2),其中每个条目是a的列乘以B的每行 例如,对于上面的A和B,3D张量应具有以下矩阵: [[0,0], [0, 0]], [[1, 1], [3, 3]], [[2, 2], [6, 6]], [[0, 0], [0, 0]], [[2, 2], [4, 4]], [[4, 4], [8,
A=torch.FloatTensor([[1,2],[3,4])
B=火炬.浮标张量([[0,0],[1,1],[2,2]]
是否有一种有效的方法来计算形状张量(6,2,2),其中每个条目是a
的列乘以B
的每行
例如,对于上面的A和B,3D张量应具有以下矩阵:
[[0,0],
[0, 0]],
[[1, 1],
[3, 3]],
[[2, 2],
[6, 6]],
[[0, 0],
[0, 0]],
[[2, 2],
[4, 4]],
[[4, 4],
[8, 8]]]
我知道如何通过for循环来实现,但我想知道是否有一种有效的方法来保存它。Pytorch张量实现,它将解决这个问题
这个问题不清楚你是想执行矩阵乘法还是元素乘法。在长度2的情况下,你展示了两者是等价的,但对于更高的维度,这肯定不是真的!谢天谢地,代码几乎相同,所以我只给出两个选项
A=torch.FloatTensor([[1,2],[3,4])
B=火炬.浮标张量([[0,0],[1,1],[2,2]]
#矩阵乘法
C_mm=(A.T[:,无,:,无]@B[无,:,无,:])。展平(0,1)
#元素乘法
C_ew=(A.T[:,无,:,无]*B[无,:,无,:])。展平(0,1)
代码描述。
A.T
转置A
,使用None
的索引插入单一维度,因此A.T[:,None,:,None]
将是形状(2,1,2,1)
和B[None,:,None,:]
是形状(1,3,1,2)
。由于@
(矩阵乘法)对张量的最后两个维度进行运算,并广播其他维度,因此结果是A
的每一列乘以B
的每一行的矩阵乘法。在元素方面的情况下,在每个维度上执行广播。结果是一个(2,3,2,2)
张量。要把它变成一个(6,2,2)
张量,我们只需要用将前两个维度展平。你是指矩阵乘法还是广播元素乘法?当A和B的行和列的长度为2时,两者给出相同的结果。谢谢。这部分解决了我的大问题。