Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 有没有更好的方法来倍增&;沿第一维求两个Pytorch张量之和?_Python_Pytorch_Tensor - Fatal编程技术网

Python 有没有更好的方法来倍增&;沿第一维求两个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,

我有两个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, 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]])