pytorch广播如何工作?

时间:2018-07-16 22:53:17

标签: python numpy linear-algebra pytorch numpy-broadcasting

torch.add(torch.ones(4,1), torch.randn(4))

产生一个张量为torch.Size([4,4])的张量。

有人可以为此提供逻辑依据吗?

1 个答案:

答案 0 :(得分:10)

PyTorch broadcasting基于 numpy广播语义,可以通过阅读numpy broadcasting rules PyTorch broadcasting guide 来理解。通过示例详细说明该概念将很容易理解。因此,请参见下面的示例:

In [27]: t_rand
Out[27]: tensor([ 0.23451,  0.34562,  0.45673])

In [28]: t_ones
Out[28]: 
tensor([[ 1.],
        [ 1.],
        [ 1.],
        [ 1.]])

现在使用torch.add(t_rand, t_ones),将其可视化为:

               # shape of (3,)
               tensor([ 0.23451,      0.34562,       0.45673])
      # (4, 1)          | | | |       | | | |        | | | |
      tensor([[ 1.],____+ | | |   ____+ | | |    ____+ | | |
              [ 1.],______+ | |   ______+ | |    ______+ | |
              [ 1.],________+ |   ________+ |    ________+ |
              [ 1.]])_________+   __________+    __________+

应该使输出的形状为(4,3)的张量为:

# shape of (4,3)
In [33]: torch.add(t_rand, t_ones)
Out[33]: 
tensor([[ 1.23451,  1.34562,  1.45673],
        [ 1.23451,  1.34562,  1.45673],
        [ 1.23451,  1.34562,  1.45673],
        [ 1.23451,  1.34562,  1.45673]])

另外,请注意,即使与上一个参数相反的顺序传递参数,我们也会得到完全相同的结果:

# shape of (4, 3)
In [34]: torch.add(t_ones, t_rand)
Out[34]: 
tensor([[ 1.23451,  1.34562,  1.45673],
        [ 1.23451,  1.34562,  1.45673],
        [ 1.23451,  1.34562,  1.45673],
        [ 1.23451,  1.34562,  1.45673]])

无论如何,我更喜欢前一种理解方式,以实现更直接的直观性。


为了便于理解,我挑选出更多示例,如下所示:

Example-1:

broadcasting-1


Example-2:

theano broadcasting

TF分别代表TrueFalse,并指出允许广播的尺寸(来源:Theano)。


Example-3:

有些形状的数组b广播以匹配数组a的形状。

broadcastable shapes