Python 有没有更好的方法来倍增&;沿第一维求两个Pytorch张量之和?
我有两个Pytorch张量,Python 有没有更好的方法来倍增&;沿第一维求两个Pytorch张量之和?,python,pytorch,tensor,Python,Pytorch,Tensor,我有两个Pytorch张量,a和b,分别是(S,M)和(S,M,H)M是我的批次维度。我想将这两个张量相乘并求和,这样输出的是形状(M,H)。也就是说,我想计算a[s]*b[s]的s之和 例如,对于S=2,M=2,H=3: 导入火炬 >>>S,M,H=2,2,3 >>>a=火炬。arange(S*M)。视图((S,M)) 张量([[0,1], [2, 3]]) >>>b=火炬。arange(S*M*H)。视图((S,M,H)) 张量([[0,1,2], [ 3, 4, 5]], [[ 6,
a
和b
,分别是(S,M)
和(S,M,H)
M
是我的批次维度。我想将这两个张量相乘并求和,这样输出的是形状(M,H)
。也就是说,我想计算a[s]*b[s]
的s
之和
例如,对于S=2
,M=2
,H=3
:
导入火炬
>>>S,M,H=2,2,3
>>>a=火炬。arange(S*M)。视图((S,M))
张量([[0,1],
[2, 3]])
>>>b=火炬。arange(S*M*H)。视图((S,M,H))
张量([[0,1,2],
[ 3, 4, 5]],
[[ 6, 7, 8],
[ 9, 10, 11]]])
'''
期望输出:
= [[0*[0, 1, 2] + 2*[6, 7, 8]],
[1*[3, 4, 5] + 3*[9, 10, 11]]]
= [[12, 14, 16],
[30, 34, 38]]
注:形状为(2,3)=(M,H)
'''
我找到了一种方法,使用火炬。火炬
>output=torch.tensordot(a,b,([0],[0]))
张量([[12,14,16],
[18, 20, 22]],
[[18, 22, 26],
[30, 34, 38]]])
>>>输出.形状
火炬尺寸([2,2,3])#始终为(M,M,H)
>>>输出=输出[torch.arange(M),torch.arange(M),:]
张量([[12,14,16],
[30, 34, 38]])
但正如你所看到的,这会造成很多不必要的计算,我必须将与我相关的部分切分
有没有更好的方法不需要进行不必要的计算?这应该可以:
(torch.unsqueeze(a, 2)*b).sum(axis=0)
>>> tensor([[12, 14, 16],
[30, 34, 38]])
这应该起作用:
(torch.unsqueeze(a, 2)*b).sum(axis=0)
>>> tensor([[12, 14, 16],
[30, 34, 38]])