pytorchにおける次元とそのsqueeze()、unsqueeze()関数の理解
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/
関連
-
[解決済み] Pytorch ある割合で特定の値を持つランダムなint型テンソルを作成する方法は?例えば、25%が1で残りが0というような。
-
[Centernet recurrence] AttributeError:Can't pickle local object 'get_dataset.<locals>.Dataset
-
AttributeError NoneType オブジェクトに属性データがない。
-
ピトーチリピートの使用方法
-
Pytorch torch.Tensor.detach()メソッドの使い方と、指定したモジュールの重みを変更する方法
-
torch.stack()の使用
-
torch.stack()の公式解説、詳細、例題について
-
pytorchラーニングノート(XIV)。DataLoaderのソースコード読み込み
-
ピトーチテンソルインデックス
-
PyTorchのF.cross_entropy()関数
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン