web-dev-qa-db-ja.com

pytorchブロードキャストはどのように機能しますか?

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

サイズがtorch.Size([4,4])のテンソルを生成します。

誰かがこの背後にあるロジックを提供できますか?

4
Aerin

PyTorchbroadcasting は、numpyブロードキャストセマンティクスに基づいています。 _numpy broadcasting rules_ またはPyTorchブロードキャストガイド。例を使って概念を説明すると、それをよりよく理解するために直感的になります。したがって、以下の例を参照してください。

_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

16
kmario23