1. ホーム
  2. ピトーチ

pytorchにおける次元とそのsqueeze()、unsqueeze()関数の理解

2022-02-23 18:21:49

 I. テンソルの次元を理解する

TensorFlowではテンソルの次数、次元、形状が明確に定義されていますが、pytorhでの定義は曖昧で、テンソルの大きさを見るにはtorch.size()関数しかありません(サイズというのはTensorFlowのテンソルの形状の記述で、Numpyの .shapeと似たような意味合いです)。そこで、まず、テンソルの形状を見る方法を考えよう。

import torch

z = torch.ones(2,3,4)
print(z)
print(z.size())
print(z.size(0))
print(z.size(1))
print(z.size(2))


上記のコードのコンソール出力は

tensor([[1.,1.,1.,1.,1,
         [1., 1., 1., 1.],
         [1., 1., 1., 1.]],

        [[1., 1., 1., 1,]
         [1., 1., 1., 1.],
         [1., 1., 1., 1., 1.]]])
トーチ.サイズ([2, 3, 4])

2
3
4

このように、サイズ(2, 3, 4)のテンソルを作成することに成功したが、では、テンソルのサイズを手動でどのように特定すればよいのだろうか。直感的にわかるように、このテンソルの括弧の位置を一つ変えてみることにする。

[
    [
         [1., 1., 1., 1.],
         [1., 1., 1., 1.],
         [1., 1., 1., 1.], [1., 1., 1.
    ],

    [
         [1., 1., 1., 1.],
         [1., 1., 1., 1.],
         [1., 1., 1., 1.], [ [1., 1., 1.
    ]
]

 と見ることができます。

最初の(一番外側の)レベルの括弧は2つの括弧(カンマで区切られる)を含み、これは(2、3、4)の2である

2段目の括弧は3つの括弧(カンマで区切られる)を含み、これは(2, 3, 4)の3である。

3段目の括弧には4つの数字(カンマで区切る)が入っており、これは(2, 3, 4)の4となります。

結論 pytorchのテンソル次元は、最初の数値の前にある括弧の数で判断でき、括弧の次元がいくつあるかは何番目かです。もし高次元のベクトルが得られたら、一番外側の括弧を取り除き、一番外側の次元のカンマの数を数え、カンマの数に1を加えて最高次元とし、これを全部解析するまで繰り返す。

また、次のこともわかります。

z.size(0) = 2, z.size(1) = 3, z.size(2) = 4

0次元は2、1次元は3、2次元は4、つまり、0から始まる次元のラベルが貼られています。 このことは、squeeze()とunsqueeze()の形式パラメータの記述からも明らかである。

II. squeeze() と unsqueeze()

1. torch.squeeze(入力, dim=None, 出力=None)

dim が与えられない場合、入力テンソル形状は 1  が削除されて返される。 入力が (A×1×B×1×C×1×D)(A×1×B×1×C×1×D) のような形状であれば、出力の形状は (A×B×C×D)(A×B×C×D)

が与えられると dim の場合、squeeze 操作は与えられた次元に対してのみ行われます。つまり、もし tensor.size(dim) = 1 ならば、その次元は削除されます。

例えば、入力形状が (a×1×b)(a×1×b) となる。  squeeze(input, 0)  は、テンソルを変更しないようにします。  squeeze(input, 1) の場合、形状は(A×B)(A×B)になります。

注意:戻り値のテンソルは入力テンソルとメモリを共有しているので、一方の内容を変更するともう一方も変更される。

パラメータ

  • input (Tensor) - 入力テンソル。
  • dim (int、オプション) - 与えられた場合、それは input は、指定された次元でのみ絞り込まれ、次元の添字は <スパン (0から始まる)
  • out (Tensor、オプション) - 出力テンソル

2. torch.unsqueeze(input, dim, out=None)

入力の指定された位置に1次元を挿入した新しいテンソルを返す。

注意:戻り値のテンソルは入力テンソルとメモリを共有しているので、一方の内容を変更すると他方も変更される。

もし dim が負の値であれば、dim+input.dim()+1dim+input.dim()+1 に変換されます。

パラメータです。

  • tensor (Tensor) - 入力テンソル
  • dim (int) - ディメンジョンのインデックスを挿入します。 (0から始まる)
  • out (Tensor、オプション) - 結果テンソル
import torch

x = torch.ones(4)
print(x)
print(x.size())

y = torch.unsqueeze(x, 0)
print(y)
print(y.size())

z = torch.unsqueeze(x, 1)
print(z)
print(z.size())

 ディメンジョンを挿入する前。

[ 1, 1, 1, 1 ]

0次元に(1, 4)となるように次元を挿入する、つまり一番外側の次元に括弧を挿入するだけである。

[ [ 1, 1, 1, 1 ] ]

1次元に次元を挿入して(4, 1)とする

[ [1], [1], [1], [1] ]

プログラムの出力は次のとおりです。

tensor([1., 1., 1., 1., 1.])
トーチ.サイズ([4])
テンソル([[1., 1., 1., 1., 1.]])
トーチ.サイズ([1, 4])
tensor([[1,]
        [1.],
        [1.],
        [1.]])
トーチ.サイズ([4, 1])

https://blog.csdn.net/ZT0518/article/details/86440101

https://www.pytorchtutorial.com/docs/package_references/torch/