Tensor操作の詳しい挙動を確認する。
torch.unsqueeze(input: Tensor, dim: int) → Tensor
-
documentはこちら
torch.unsqueeze — PyTorch 1.6.0 documentation -
inputしたTensorの次元を一つ増やして返す。ただし挿入した次元でのsizeは1であり、要素数と要素の中身はinputと変わらない。増やす次元の場所はdimで指定し、出力のshapeのdim番目が1になるように次元が増える。
# Pythonインタプリタを使用
>>> import torch
>>> a = torch.tensor([1,2,3])
>>> a
tensor([1, 2, 3])
>>> b = a.unsqueeze(0)
>>> b.shape
# dim=0としたので、0番目の次元のsizeが1
torch.Size([1, 3])
>>> b
tensor([[1, 2, 3]])
>>> c = a.unsqueeze(1)
>>> c.shape
# dim=1としたので、1番目の次元のsizeが1
torch.Size([3, 1])
>>> c
tensor([[1],
[2],
[3]])
# dimはマイナスをとることも可能
>>> d = a.unsqueeze(-1) # a.unsqueeze(1) と同じ
>>> d.shape
# dim=-1としたので、-1番目、つまり1番目の次元のsizeが1
torch.Size([3, 1])
>>> d
tensor([[1],
[2],
[3]])
- unsqueezeなどの関数は
view
と言われていて、同じdataを保持する異なるTensorを返すものである - viewについてのdocument: https://pytorch.org/docs/stable/tensor_view.html
broadcasting
- NumPyのブロードキャスト(broadcast)をPyTorchのTensorでもサポートしている。
- documentは Broadcasting semantics — PyTorch 1.6.0 documentation
- 日本語訳もあり
- 簡潔にいうと、shape(次元数)が違う二つのTensorでも、ある特定条件を満たせば四則演算などが可能になる機能。
- ポイントは、次元数が異なる場合に末尾の次元のサイズを見ていき、サイズが同じであるか、片方が1であればブロードキャストでき、計算可能となる。
# Pythonインタプリタを使用
>>> import torch
>>> a = torch.rand(2,3,4)
>>> b = torch.rand(3)
>>> a * b
# 計算不可能
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
RuntimeError: The size of tensor a (4) must match the size of tensor b (3) at non-singleton dimension 2
>>> c = b.expand(2,3)
>>> c.shape
torch.Size([2, 3])
>>> a * c
# aの先頭の2次元とcの先頭の2次元は同じsizeだが、計算不可能
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
RuntimeError: The size of tensor a (4) must match the size of tensor b (3) at non-singleton dimension 2
>>> d = b.unsqueeze(1).expand(3,4)
>>> d.shape
torch.Size([3, 4])
>>> a * d
# 末尾の次元が同じなので計算可能