Python 张量的火炬和子集

Python 张量的火炬和子集,python,machine-learning,deep-learning,pytorch,tensor,Python,Machine Learning,Deep Learning,Pytorch,Tensor,如果张量是[20,5]的形状,那么我需要一次取10,求和,结果是[2,5] 例如: 形状[20,5]->形状[2,5](一次求和10) 形状[100,20]->形状[10,20](一次求和10) 有没有更快/最佳的方法可以做到这一点 例如: [[1,1],[1,2],[3,4],[1,2]]我想通过取两行的总和来[[2,3],[4,6]。我不知道有任何现成的解决方案 如果平均值足够,您可以使用nn.AvgPool1d: 使用此解决方案,只需确保平均尺寸正确即可 您也可以编写自己的函数,为您进行求

如果张量是[20,5]的形状,那么我需要一次取10,求和,结果是[2,5]

例如:
形状[20,5]->形状[2,5](一次求和10)
形状[100,20]->形状[10,20](一次求和10)

有没有更快/最佳的方法可以做到这一点

例如:

[[1,1],[1,2],[3,4],[1,2]]
我想通过取两行的总和来
[[2,3],[4,6]

我不知道有任何现成的解决方案

如果平均值足够,您可以使用
nn.AvgPool1d

使用此解决方案,只需确保平均尺寸正确即可

您也可以编写自己的函数,为您进行求和:

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

我不知道有什么现成的解决方案

如果平均值足够,您可以使用
nn.AvgPool1d

使用此解决方案,只需确保平均尺寸正确即可

您也可以编写自己的函数,为您进行求和:

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

这并不完全清楚,但我不能对此发表评论,所以

对于第一种情况,您有:

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.]])

对于第二种情况,我们用一个元素的张量()表示

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.]])


这就是你要找的吗?

还不完全清楚,但我不能对此发表评论,所以

对于第一种情况,您有:

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.]])

对于第二种情况,我们用一个元素的张量()表示

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.]])


这就是你要找的吗?

你说的“我一次需要取10,然后求和”是什么意思?你能举一个例子,输入形状[4,2],输出形状[2,2]吗。我们必须看看你想要的确切运算是什么……是的[[1,1],[1,2],[3,4],[1,2]]我想要[[2,3],[4,6]]你说的“我一次需要取10并求和它们”是什么意思?你能举一个输入[4,2]和输出[2,2]的例子吗。我们必须看看你想要的确切操作是什么…是的[[1,1],[1,2],[3,4],[1,2]]我想要[[2,3],[4,6]]是的,我也使用了循环,速度非常慢。将尝试平均池。谢谢你是的,我也用了loop,速度很慢。将尝试平均池。非常感谢。