テンソルの操作
- Inside 245-5D - PyTorch internals
- 【PyTorch】Tensorを操作する関数(transpose、view、reshape)
- torch.catの動きを理解する
- pytorch Tensor操作チートシート
- torch.dotとtorch.mmとtorch.mvとtorch.bmmとtorch.matmulを比較する
Tensorの形状
cat
- dimで指定した部分だけ異なっていればcatで結合できる
- 下の例だと、奥行き3m, 幅4mの部屋がそれぞれ2階,2階,5階あるのでくっつけて9階建てにしたみたいな
import torch input1 = torch.randn(2, 3, 4) input2 = torch.randn(2, 3, 4) input3 = torch.randn(5, 3, 4) input_list = [input1, input2, input3] output1 = torch.cat(input_list, dim=0) print(output1.size()) # torch.Size([9, 3, 4])
transpose
- 転置
- これ第二引数以降意味あるのかな??
- 転置行列 と同じ概念
- \( \begin{eqnarray} (2, 3, 5, 8)^T = \left[ \begin{array}{ccc} 2 \\ 3 \\ 5 \\ 8 \\ \end{array} \right] \end{eqnarray} \) と書けるし、逆に \( \begin{eqnarray} \left[ \begin{array}{ccc} 2 \\ 3 \\ 5 \\ 8 \\ \end{array}\right]^T = (2, 3, 5, 8) \end{eqnarray} \) となるらしい
>>> import torch >>> x = torch.randn(4, 3) >>> x tensor([[ 0.2062, -1.0431, -0.5528], [ 1.8057, 0.7966, -0.6941], [-1.3884, -2.0070, -0.2932], [-0.6781, -0.0142, 0.8535]]) >>> torch.t(x) tensor([[ 0.2062, 1.8057, -1.3884, -0.6781], [-1.0431, 0.7966, -2.0070, -0.0142], [-0.5528, -0.6941, -0.2932, 0.8535]])
view
1つ目の引数に-1を入れることで、2つ目の引数で指定した値にサイズ数を自動的に調整してくれます。
Tensorの要素数が指定したサイズ数に合わない(割り切れない)場合、エラーになります。
もちろん、サイズ数を指定することもできます。
>>> x tensor([[ 0.2062, -1.0431, -0.5528], [ 1.8057, 0.7966, -0.6941], [-1.3884, -2.0070, -0.2932], [-0.6781, -0.0142, 0.8535]]) >>> x.view(-1, 2) # サイズ数を自動的に調整してくれる tensor([[ 0.2062, -1.0431], [-0.5528, 1.8057], [ 0.7966, -0.6941], [-1.3884, -2.0070], [-0.2932, -0.6781], [-0.0142, 0.8535]]) >>> x.view(-1, 6) # サイズ数を自動的に調整してくれる tensor([[ 0.2062, -1.0431, -0.5528, 1.8057, 0.7966, -0.6941], [-1.3884, -2.0070, -0.2932, -0.6781, -0.0142, 0.8535]]) ↑上記、縦横の要素数は変わっても、全体の要素数は変わっていないことに注目 ↓全体の要素数が変わるような指定をするとエラーになる >>> x.view(-1, 5) # Tensorの要素数が指定したサイズ数に合わない Traceback (most recent call last): File "<stdin>", line 1, in <module> RuntimeError: invalid argument 2: size '[-1 x 5]' is invalid for input with 12 elements at /Users/soumith/code/builder/wheel/pytorch-src/aten/src/TH/THStorage.cpp:80 >>> x.view(3, 4) # サイズ数を指定 tensor([[ 0.2062, -1.0431, -0.5528, 1.8057], [ 0.7966, -0.6941, -1.3884, -2.0070], [-0.2932, -0.6781, -0.0142, 0.8535]])
tensor-image.png