_torch.add(torch.ones(4,1), torch.randn(4))
_
サイズがtorch.Size([4,4])
のテンソルを生成します。
誰かがこの背後にあるロジックを提供できますか?
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:
_
_Example-2:
_:
T
とF
はそれぞれTrue
とFalse
を表し、ブロードキャストを許可する次元を示します(出典: Theano )。
_Example-3:
_
配列b
がブロードキャストされ、配列a
の形状と一致するいくつかの形状を次に示します。