张量的火炬和子集

时间:2020-08-04 05:22:27

标签: python machine-learning deep-learning pytorch tensor

如果张量的形状为[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]]通过两行求和。

2 个答案:

答案 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