如果张量的形状为[20,5],那么我需要一次取10并求和,因此结果为[2,5]。
例如:
shape [20,5]-> shape [2,5](一次加10)
shape [100,20]-> shape [10,20](一次加10)
是否有更快/最佳的方式来做到这一点?
例如:
[[1, 1], [1, 2], [3, 4], [1,2]]
我希望[[2, 3], [4, 6]]
通过两行求和。
答案 0 :(得分:2)
目前尚不清楚,但是我不能对此发表评论。
对于第一种情况,您具有:
t1 = torch.tensor([[1., 1.], [1., 2.], [3., 4.], [1.,2.]])
t1.shape #=> torch.Size([4, 2])
t1
tensor([[1., 1.],
[1., 2.],
[3., 4.],
[1., 2.]])
要获得所需的输出,您应该调整形状:
tr1 = t1.reshape([2, 2, 2])
res1 = torch.sum(tr1, axis = 1)
res1.shape #=> torch.Size([2, 2])
res1
tensor([[2., 3.],
[4., 6.]])
在第二种情况下,让所有元素(torch.ones)都为张量。
t2 = torch.ones((20, 5))
t2.shape #=> torch.Size([20, 5])
t2
tensor([[1., 1., 1., 1., 1.],
[1., 1., 1., 1., 1.],
[1., 1., 1., 1., 1.],
[1., 1., 1., 1., 1.],
[1., 1., 1., 1., 1.],
[1., 1., 1., 1., 1.],
[1., 1., 1., 1., 1.],
[1., 1., 1., 1., 1.],
[1., 1., 1., 1., 1.],
[1., 1., 1., 1., 1.],
[1., 1., 1., 1., 1.],
[1., 1., 1., 1., 1.],
[1., 1., 1., 1., 1.],
[1., 1., 1., 1., 1.],
[1., 1., 1., 1., 1.],
[1., 1., 1., 1., 1.],
[1., 1., 1., 1., 1.],
[1., 1., 1., 1., 1.],
[1., 1., 1., 1., 1.],
[1., 1., 1., 1., 1.]])
因此,重塑以获得所需的(?)结果:
tr2 = tensor.reshape((10, 2, 5))
res2 = torch.sum(tr2, axis = 0)
res2.shape #=> torch.Size([2, 5])
res2
tensor([[10., 10., 10., 10., 10.],
[10., 10., 10., 10., 10.]])
这是您要寻找的吗?
答案 1 :(得分:0)
我不知道有任何现成的解决方案。
如果拥有平均值就可以使用nn.AvgPool1d
https://pytorch.org/docs/stable/generated/torch.nn.AvgPool1d.html#avgpool1d:
import torch, torch.nn as nn
input = torch.rand(batch_size, channels, lenght)
pool = nn.AvgPool1D(kernel_size=10, stride=10)
avg = pool(input)
使用此解决方案,只需确保您对平均尺寸进行平均即可。
您还可以只编写自己的函数来为您求和:
import torch
def SumWindow(input, window_size, dim):
input_split = torch.split(input, window_size, dim)
input_sum = [v.sum(dim=dim), for v in input_split] # may be expensive if there are too many tensors
out = torch.cat(inptu_sum, dim=dim)
return dim