Python 在PyTorch中并行求特征贴图中所有对角线的和

Python 在PyTorch中并行求特征贴图中所有对角线的和,python,pytorch,Python,Pytorch,假设我有一个张量形状的(1,64,128,128),我想创建一个(1,64,255)张量形状的(1,64,255),保存每个(128,128)矩阵的所有对角线的总和(有1个主对角线,下面127个,上面127个对角线,所以总共255个)。我目前正在做的工作如下: digitized = np.sum(np.indices(a.shape), axis=0).ravel() digitized_tensor = torch.Tensor(digitized).int() a_tensor = tor

假设我有一个张量形状的
(1,64,128,128)
,我想创建一个
(1,64,255)
张量形状的
(1,64,255)
,保存每个
(128,128)
矩阵的所有对角线的总和(有1个主对角线,下面127个,上面127个对角线,所以总共255个)。我目前正在做的工作如下:

digitized = np.sum(np.indices(a.shape), axis=0).ravel()
digitized_tensor = torch.Tensor(digitized).int()
a_tensor = torch.Tensor(a)
torch.bincount(digitized_tensor, a_tensor.view(-1))
x=torch.rand(1,64,128,128)
diag_sums=火炬零点(1、64、255)
j=0
对于范围内的k(-127128):
diag_sums[j,:,k+127]=torch.diagonal(x,offset=k,dim1=-2,dim2=-1)。sum(dim=2)
您考虑过使用吗?
可以使用对角过滤器对对角线求和,通过适当的零填充滑动张量

导入火炬
导入torch.nn。功能为nnf
#使用“eye”函数构造一个对角过滤器,并适当地塑造它
f=火炬眼(x.shape[2])[None,None,…]重复(x.shape[1],1,1,1)
#使用适当的零填充计算对角线和
conv_diag_sums=nnf.conv2d(x,f,padding=(x.shape[2]-1,0),groups=x.shape[1])[…,0]
请注意,结果的顺序与您在循环中计算的顺序略有不同:

diag_sums=torch.zero(1,64255)
对于范围内的k(-127128):
对角线和[j,:,127-k]=火炬.对角线(x,偏移量=k,dim1=-2,dim2=-1).和(dim=2)
#比较
(conv_diag_sums==diag_sums)。all()

结果与
True
-它们是相同的。

Shai的答案有效,但是由于内核的大尺寸,它看起来有很多乘法。我为我的用例想出了一种方法。它基于Numpy中一个类似问题的答案:

我正在做以下工作:

digitized = np.sum(np.indices(a.shape), axis=0).ravel()
digitized_tensor = torch.Tensor(digitized).int()
a_tensor = torch.Tensor(a)
torch.bincount(digitized_tensor, a_tensor.view(-1))

如果我能找到一种完全在PyTorch中实现这一点的方法(不使用Numpy的index函数),那就太好了,但这回答了问题。

我在下面写了一个备选方案。然而,这个答案是可微的,如果用于深度学习,它更适合。