Über Pytorch-Tensor-Dimensionsumwandlung und Tensor-Operationen

tensor 乘
tensor 加
# view()    转换维度
# reshape() 转换维度
# permute() 坐标系变换
# squeeze()/unsqueeze() 降维/升维
# expand()   扩张张量
# narraw()   缩小张量
# resize_()  重设尺寸
# repeat(), unfold() 重复张量
# cat(), stack()     拼接张量

1 tensor.view()

view() wird verwendet, um die Form des Tensors zu ändern , ändert jedoch nicht die Elementwerte im Tensor .
Verwendung 1:
Sie können beispielsweise view verwenden, um einen Tensor mit der Form (2, 3) in einen Tensor mit der Form (3, 2) umzuwandeln.

import torch
x = torch.tensor([[1, 2, 3], [4, 5, 6]])
y = x.view(3, 2)    

Die obige Operation entspricht der ersten Abflachung des Tensors mit der Form **(2, 3) in (1, 6) und dann in (3, 2).**

Verwendung 2:
Die Anzahl der Elemente im Tensor bleibt vor und nach der Konvertierung unverändert. Wenn die Dimension einer bestimmten Dimension in view() -1 ist , bedeutet dies, dass die Dimension dieser Dimension entsprechend der Gesamtzahl der Elemente und der Größe anderer Dimensionen adaptiv angepasst wird . Beachten Sie, dass die Dimension von höchstens einer Dimension in view() auf -1 gesetzt werden kann .

z = x.view(-1,2)

Bild.png

Beispiel:
In Faltungs-Neuronalen Netzen werden Ansichten häufig in der vollständig verbundenen Schicht verwendet, um die Tensordimensionen zu strecken:
Angenommen, das Eingabemerkmal ist ein 4-dimensionaler Tensor von B C H*W , wobei B die Stapelgröße und C die Merkmale darstellt. Die Anzahl der Kanäle H und W stellt die Höhe und Breite des Features dar. Bevor das Feature an die vollständig verbundene Ebene gesendet wird, wird .view verwendet, um es in einen zweidimensionalen Tensor von B*(C H W) umzuwandeln . Das heißt, der Stapel bleibt unverändert, konvertiert jedoch jedes Merkmal in einen eindimensionalen Vektor.

2 tensor.reshape()

reshape() wird auf die gleiche Weise wie view() verwendet.
Bild.png

3 tensor.squeeze() und tensor.unsqueeze()

3.1 Dimensionsreduzierung von tensor.squeeze()

(1) Wenn die Squeeze()-Klammern leer sind, werden alle Dimensionen mit der Dimension 1 im Tensor komprimiert , z. B. die Dimension des Tensors von 1, 2, 1, 9 auf 2, 9 Dimensionen reduziert; falls vorhanden ist keine 1 in der Dimension. Wenn die Dimension des Tensors gleich ist, bleibt die Quelldimension unverändert. Wenn beispielsweise ein 2 3 4-dimensionaler Tensor gestaucht wird, ändert sich die Dimension nach der Konvertierung nicht.
(2) Wenn Squeeze(idx) verwendet wird , wird die entsprechende idx-te Dimension im Tensor komprimiert. Wenn beispielsweise Squeeze(2) für die Tensoren 1, 2, 1 und 9 ausgeführt wird, beträgt die Dimension reduziert auf 1, 2 und 9 Dimensionen. Tensor; wenn die Dimension der idx-Dimension nicht 1 ist, ändert sich die Dimension nach dem Zusammendrücken nicht.
Zum Beispiel:
Bild.png

3.2 tensor.unsqueeze(idx)-Version

Die Dimensionsaktualisierung erfolgt in der idx-Dimension und der Tensor wird von der ursprünglichen Dimension n auf die Dimension n+1 aktualisiert . Die Dimension eines Tensors beträgt beispielsweise 2*3. Nach unsqueeze(0) wird er zu einem Tensor mit den Dimensionen 1, 2 und 3.
Bild.png

4 tensor.permute()

Die Koordinatensystemtransformation, also die Matrixtransposition , wird auf die gleiche Weise wie die Transponierung des Numpy-Arrays verwendet . Die Parameternummern in permute()-Klammern beziehen sich auf die Indexwerte jeder Dimension. Permute ist eine Technik, die häufig beim Deep Learning verwendet wird. Im Allgemeinen wird der Merkmalstensor von BCHW durch Transposition in den Merkmalstensor von BHWC umgewandelt , dh die Merkmalstiefe wird durch Aufrufen von **tensor.permute(0) in die letzte Dimension umgewandelt. 2, 3, 1)**realisiert.
Torch.transpose kann nur die Transponierung einer 2D-Matrix durchführen, während die Funktion permute() jede hochdimensionale Matrix transponieren kann.
Einfaches Verständnis: permute() entspricht der gleichzeitigen Bedienung mehrerer Tensordimensionen, und transpose kann nur wirken gleichzeitig auf den Tensor. von zwei Dimensionen.

Bild.png

Obwohl sowohl „permute“ als auch „view/reshape“ Tensoren in bestimmte Dimensionen umwandeln können, sind ihre Prinzipien völlig unterschiedlich, also achten Sie auf die Unterscheidung. Nach der Ansichts- und Umformungsverarbeitung ändert sich die Reihenfolge der Elemente im Tensor nicht, aber die Anordnung der Elemente ändert sich nach der Permute-Transposition, da sich das Koordinatensystem ändert.

5 Torch.cat([a,b],dim)

Beim Tensorspleißen in der Dim-Dimension sollte darauf geachtet werden, dass die Dimensionen konsistent bleiben .
Angenommen, a ist ein zweidimensionaler Tensor von h1 w1, b ist ein zweidimensionaler Tensor von h2 w2, und Torch.cat(a,b,0) bedeutet Spleißen in der ersten Dimension , also Spleißen in Spaltenrichtung w1 und w2 müssen gleich sein. Torch.cat(a,b,1) bedeutet Spleißen in der zweiten Dimension, also Spleißen in Zeilenrichtung , daher müssen h1 und h2 gleich sein .
Angenommen, a ist ein zweidimensionaler Tensor von c1 h1 w1 und b ist ein zweidimensionaler Tensor von c2 h2 w2. Torch.cat (a, b, 0) bedeutet Spleißen in der ersten Dimension, dh Spleißen im Kanal Dimension des Features. Andere Dimensionen müssen konsistent bleiben, d. h. w1=w2, h1=h2. Torch.cat(a,b,1) bedeutet Spleißen in der zweiten Dimension, also Spleißen in Spaltenrichtung. Es muss sichergestellt sein, dass w1=w2, c1=c2; Torch.cat(a,b,2) bedeutet Spleißen in der dritten Dimension. Das heißt, beim Spleißen in Zeilenrichtung muss h1=h2, c1=c2 gewährleistet sein;
Bild.png

6 Torch.stack()

Diese Funktion verbindet mehrere Tensoren mit derselben Form in einer Dimension, und das Endergebnis wird dimensional vergrößert; das heißt, mehrere Tensoren werden in einer bestimmten Dimension verbunden, um einen erweiterten Tensor zu erzeugen. Gestapeltes Gefühl.
Bild.png

7 Torch.chunk() und Torch.split()

torch.chunk(input, chunks, dim)

Die Funktion von **torch.chunk()** besteht darin, einen Tensor gleichmäßig in mehrere kleine Tensoren aufzuteilen. Eingabe ist der geteilte Tensor. Chunks ist die Anzahl der gleichmäßig geteilten Teile. Wenn die Größe in der Divisionsdimension nicht durch Chunks teilbar ist, ist der letzte Tensor etwas kleiner (oder kann leer sein). dim bestimmt die Aufteilung entlang einer bestimmten Dimension. Diese Funktion gibt ein Tupel zurück, das aus kleinen Tensoren besteht.
Bild.png

**torch.split () ** kann als aktualisierte Version von Torch.chunk () bezeichnet werden und kann nicht nur gleichmäßig nach der Anzahl der Kopien, sondern auch nach einem bestimmten Plan aufgeteilt werden.

torch.split(input, split_size_or_sections, dim=0)

Der Unterschied zu Torch.chunk() liegt im zweiten Parameter. Wenn der zweite Parameter die Anzahl der Teilungen ist, ist dies dasselbe wie bei Torch.chunk (); der zweite Parameter ist der Teilungsplan, bei dem es sich um Listentypdaten handelt. Der zu teilende Tensor wird in len-Teile (Listenteile) unterteilt . , die Größe jedes Teils hängt von den Elementen in der Liste ab.
Bild.png

8 Multiplikationsoperation mit Tensor

  • Elementweise , das heißt, die entsprechenden Elemente von Matrizen derselben Form werden multipliziert. Die erhaltenen Elemente sind die Werte jedes Elements in der Ergebnismatrix. Die entsprechende Funktion ist Torch.mul() (derselbe Effekt wie * ).

Bild.png

  • Für die Matrixmultiplikation ist die entsprechende Funktion Torch.mm() ( kann nur für 2D-Tensor verwendet werden) oder Torch.matmul() (gleicher Effekt wie das Symbol @). Definieren Sie für Torch.matmul() die Matrixmultiplikation nur in den letzten beiden Dimensionen , und die vorherigen Dimensionen müssen konsistent sein. Wenn die vorherigen Dimensionen dem Broadcast_tensor-Mechanismus entsprechen, werden die Dimensionen automatisch erweitert, um sicherzustellen, dass die vorherigen Dimensionen der beiden Matrizen konsistent sind.

Bild.png
Bild.png

9 Additionsoperation mit Tensor

Befolgen Sie diese beiden Punkte:

  • Wenn die Dimensionen zweier Tensoren gleich sind , sollten die Werte der entsprechenden Achsen gleich sein (die Größe jeder Dimension ist gleich), oder die Größe einiger Dimensionen sollte 1 sein. Kopieren und erweitern Sie beim Hinzufügen alle Achsen, die 1 sind, um zwei Tensoren mit den gleichen Abmessungen zu erhalten, und fügen Sie dann die entsprechenden Positionen hinzu.
  • Wenn die Dimensionen der beiden hinzugefügten Tensoren inkonsistent sind , richten Sie zuerst den Tensor mit einer niedrigeren Dimension von rechts nach dem Tensor mit einer höheren Dimension aus, erweitern Sie die Dimension um 1, um mit der Dimension des hochdimensionalen Tensors übereinzustimmen, und dann Führen Sie den Vorgang <1> durch.

Bild.png

10 tensor.expand()

Erweitern Sie einen Tensor , um eine einzelne Dimension durch Kopieren von Werten auf eine größere Größe zu erweitern . Durch die Verwendung der Funktion expand() wird der ursprüngliche Tensor nicht geändert und das Ergebnis muss neu zugewiesen werden. Im Folgenden finden Sie konkrete Beispiele:
Nehmen Sie als Beispiel einen zweidimensionalen Tensor: Tensor ist ein eindimensionaler Tensor mit 1 n oder n . Rufen Sie tensor.expand(s, n) bzw. tensor.expand(n, s) in der Zeile auf Richtung und Spaltenrichtung. Richtung zum Erweitern.
Der Füllparameter von expand() ist size

Bild.png

11 tensor.narrow(dim, start, len)

Die Funktion „narrow()“ spielt eine Rolle beim Filtern von Daten in einer bestimmten Dimension.

torch.narrow(input, dim, start, length)->Tensor

Eingabe ist der Tensor, der geschnitten werden muss, dim ist die Slice-Dimension, start ist der Startindex und Länge ist die Slice-Länge. Die eigentliche Anwendung ist wie folgt:

Bild.png

12 tensor.resize_()

Größenänderungen, kürzen Sie den Tensor auf die Abmessungen nach resize_.
Bild.png

13 tensor.repeat()

tensor.repeat(a,b) kopiert den gesamten Tensor a in Zeilenrichtung und b in Spaltenrichtung.

Bild.png

14 unbind()

Nachdem Torch.unbind() die angegebene Dimension entfernt hat, gibt es ein Tupel zurück, das jedes Segment entlang der angegebenen Dimension enthält.

torch.unbind(input, dim=0)->seq

Bild.png

Referenz:

Funktionen im Zusammenhang mit Tensor-Dimensionsänderungen in Pytorch (kontinuierlich aktualisiert) – weili21s Artikel – Zhihu
https://zhuanlan.zhihu.com/p/438099006

[Pytorch-Tensor-Tensor-Dimensionskonvertierung (Tensor-Dimensionskonvertierung)]
https://blog.csdn.net/x_yan033/article/details/104965077

Supongo que te gusta

Origin blog.csdn.net/Alexa_/article/details/134171971
Recomendado
Clasificación