【问题标题】:Torch sum a tensor along an axisTorch 沿轴对张量求和
【发布时间】:2017-12-01 02:53:45
【问题描述】:
ipdb> outputs.size()
torch.Size([10, 100])
ipdb> print sum(outputs,0).size(),sum(outputs,1).size(),sum(outputs,2).size()
(100L,) (100L,) (100L,)

如何改为对列求和?

【问题讨论】:

    标签: python sum pytorch torch tensor


    【解决方案1】:

    最简单最好的解决方案是使用torch.sum()

    对一个张量的所有元素求和:

    torch.sum(outputs) # gives back a scalar
    

    对所有行求和(即每一列):

    torch.sum(outputs, dim=0) # size = [1, ncol]
    

    对所有列求和(即每一行):

    torch.sum(outputs, dim=1) # size = [nrow, 1]
    

    【讨论】:

    • 对结果张量维度的一个很好的观察是,无论我们提供哪个暗淡为 1,最终张量在该特定轴上的值为 1,其余轴的维度保持不变。这尤其有助于我想象在更高维张量的情况下我们将如何求和。
    【解决方案2】:

    或者,您可以使用tensor.sum(axis) 其中axis 表示01 分别对行和列求和,用于二维张量。

    In [210]: X
    Out[210]: 
    tensor([[  1,  -3,   0,  10],
            [  9,   3,   2,  10],
            [  0,   3, -12,  32]])
    
    In [211]: X.sum(1)
    Out[211]: tensor([ 8, 24, 23])
    
    In [212]: X.sum(0)
    Out[212]: tensor([ 10,   3, -10,  52])
    

    从上面的输出我们可以看出,在这两种情况下,输出都是一维张量。另一方面,如果您还希望在输出中保留原始张量的维度,那么您已将布尔 kwarg keepdim 设置为 True,如下所示:

    In [217]: X.sum(0, keepdim=True)
    Out[217]: tensor([[ 10,   3, -10,  52]])
    
    In [218]: X.sum(1, keepdim=True)
    Out[218]: 
    tensor([[ 8],
            [24],
            [23]])
    

    【讨论】:

    • 谢谢,这是一个很好的答案。这个 dim var 乍一看似乎非常违反直觉
    【解决方案3】:

    如果您有张量my_tensor,并且您希望在第二个数组维度上求和(即索引为 1 的维度,即列维度,如果张量是二维的,就像您的一样) , 使用torch.sum(my_tensor,1) 或等效的my_tensor.sum(1) 请参阅documentation here

    文档中未明确提及的一件事是:您可以使用 -1(或倒数第二个维度,使用 -2,对 last 数组维度求和,等等)

    因此,在您的示例中,您可以使用:outputs.sum(1)torch.sum(outputs,1),或者等价的 outputs.sum(-1)torch.sum(outputs,-1)。所有这些都会给出相同的结果,即大小为 torch.Size([10]) 的输出张量,每个条目是张量 outputs 的给定列中所有行的总和。

    用一个 3 维张量来说明:

    In [1]: my_tensor = torch.arange(24).view(2, 3, 4) 
    Out[1]: 
    tensor([[[ 0,  1,  2,  3],
             [ 4,  5,  6,  7],
             [ 8,  9, 10, 11]],
    
            [[12, 13, 14, 15],
             [16, 17, 18, 19],
             [20, 21, 22, 23]]])
    
    In [2]: my_tensor.sum(2)
    Out[2]:
    tensor([[ 6, 22, 38],
            [54, 70, 86]])
    
    In [3]: my_tensor.sum(-1)
    Out[3]:
    tensor([[ 6, 22, 38],
            [54, 70, 86]])
    

    【讨论】:

      【解决方案4】:

      基于文档https://pytorch.org/docs/stable/generated/torch.sum.html

      应该是

      dim (int or tuple of python:ints) – 要减少的维度。

      dim=0 表示减少行尺寸:压缩所有行 = sum by col
      dim=1 表示减少 col 维度:condense cols= sum by row

      【讨论】:

        猜你喜欢
        • 2019-08-05
        • 2021-11-10
        • 2018-02-24
        • 1970-01-01
        • 2016-05-01
        • 1970-01-01
        • 1970-01-01
        • 2020-12-15
        • 2017-09-11
        相关资源
        最近更新 更多