Technologieaustausch

Verständnis der Pytorch-Achse

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

import torch
x = torch.arange(16).reshape(1,4,4)
print(x)
print('--------')
a = x.sum(axis = 1,keepdim=True)
a2 = x.sum(axis = 1,keepdim=False)
a3 = x.sum(axis = 0,keepdim=True)
a4 = x.sum(axis = 0,keepdim=False)
a5 = x.sum(axis = 2,keepdim=True)
print(a)
print(a2)
print('----------')
print(a3)
print(a4)
print(a5)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
 import torch
x = torch.arange(16).reshape(4,4)
print(x)
print('--------')
a = x.sum(axis = 1,keepdim=True)
a2 = x.sum(axis = 1,keepdim=False)
print(a)
print(a2)
print(x/a) 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

Kombinieren Sie diese beiden Beispiele, um die Änderungen der Achse unter verschiedenen Umständen im Detail zu erklären.
Das Verständnis dimensionaler Operationen an Tensoren und der Summierung entlang bestimmter Achsen in PyTorch nimmt einige Zeit in Anspruch. Lassen Sie uns diese Vorgänge Schritt für Schritt anhand von zwei Beispielen analysieren und die Achsenänderungen in verschiedenen Situationen im Detail erläutern.

erstes Beispiel

import torch
x = torch.arange(16).reshape(1, 4, 4)
print(x)
print('--------')
a = x.sum(axis=1, keepdim=True)
a2 = x.sum(axis=1, keepdim=False)
a3 = x.sum(axis=0, keepdim=True)
a4 = x.sum(axis=0, keepdim=False)
a5 = x.sum(axis=2, keepdim=True)
print(a)
print(a2)
print('----------')
print(a3)
print(a4)
print(a5)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
Anfangstensor
tensor([[[ 0,  1,  2,  3],
         [ 4,  5,  6,  7],
         [ 8,  9, 10, 11],
         [12, 13, 14, 15]]])
  • 1
  • 2
  • 3
  • 4

Dies ist eine Form von (1, 4, 4) von Tensoren. Wir können es uns als einen Stapel vorstellen, der eine 4x4-Matrix enthält.

Summe entlang Achse 1
  1. x.sum(axis=1, keepdim=True)

Summieren Sie entlang der Achse 1 (d. h. der Richtung der zweiten Dimension, 4) und behalten Sie dabei die Dimensionen bei.

tensor([[[24, 28, 32, 36]]])
  • 1

Die Form wird (1, 1, 4)

  1. x.sum(axis=1, keepdim=False)

Summe entlang Achse 1, keine Dimensionalität erhalten.

tensor([[24, 28, 32, 36]])
  • 1

Die Form wird (1, 4)

Summe entlang der Achse 0
  1. x.sum(axis=0, keepdim=True)

Summieren Sie entlang der Achse 0 (d. h. der Richtung der ersten Dimension, 1) und behalten Sie dabei die Dimensionen bei.

tensor([[[ 0,  1,  2,  3],
         [ 4,  5,  6,  7],
         [ 8,  9, 10, 11],
         [12, 13, 14, 15]]])
  • 1
  • 2
  • 3
  • 4

Da der ursprüngliche Tensor nur ein Element auf der Achse 0 hat, ist das Ergebnis dasselbe wie beim ursprünglichen Tensor, jedoch mit der Form (1, 4, 4)

  1. x.sum(axis=0, keepdim=False)

Summe entlang der Achse 0, Dimensionalität bleibt nicht erhalten.

tensor([[ 0,  1,  2,  3],
        [ 4,  5,  6,  7],
        [ 8,  9, 10, 11],
        [12, 13, 14, 15]])
  • 1
  • 2
  • 3
  • 4

Die Form wird (4, 4)

Summe entlang Achse 2
  1. x.sum(axis=2, keepdim=True)

Summieren Sie entlang der Achse 2 (d. h. der dritten Dimension, der Richtung von 4) und behalten Sie dabei die Dimensionen bei.

tensor([[[ 6],
         [22],
         [38],
         [54]]])
  • 1
  • 2
  • 3
  • 4

Die Form wird (1, 4, 1)

Kernpunkt
  • keepdim=True Die summierten Dimensionen bleiben erhalten, die Anzahl der Dimensionen des Ergebnisses bleibt unverändert, aber die Größe der summierten Dimensionen wird 1.
  • keepdim=False Die summierten Dimensionen werden entfernt und die Anzahl der Dimensionen im Ergebnis wird um 1 reduziert.

zweites Beispiel

import torch
x = torch.arange(16).reshape(4, 4)
print(x)
print('--------')
a = x.sum(axis=1, keepdim=True)
a2 = x.sum(axis=1, keepdim=False)
print(a)
print(a2)
print(x/a)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
Anfangstensor
tensor([[ 0,  1,  2,  3],
        [ 4,  5,  6,  7],
        [ 8,  9, 10, 11],
        [12, 13, 14, 15]])
  • 1
  • 2
  • 3
  • 4

Dies ist eine Form von (4, 4) von Tensoren.

Summe entlang Achse 1
  1. x.sum(axis=1, keepdim=True)

Summieren Sie entlang der Achse 1 (d. h. der Richtung der zweiten Dimension, 4) und behalten Sie dabei die Dimensionen bei.

tensor([[ 6],
        [22],
        [38],
        [54]])
  • 1
  • 2
  • 3
  • 4

Die Form wird (4, 1)

  1. x.sum(axis=1, keepdim=False)

Summe entlang Achse 1, keine Dimensionalität erhalten.

tensor([ 6, 22, 38, 54])
  • 1

Die Form wird (4,)

Elemente geteilt durch Zeilensumme
  1. x / a
tensor([[0.0000, 0.1667, 0.3333, 0.5000],
        [0.1818, 0.2273, 0.2727, 0.3182],
        [0.2105, 0.2368, 0.2632, 0.2895],
        [0.2222, 0.2407, 0.2593, 0.2778]])
  • 1
  • 2
  • 3
  • 4

Dies ist die Summe jedes Elements dividiert durch die entsprechende Zeile, was zu Folgendem führt:

tensor([[ 0/6,  1/6,  2/6,  3/6],
        [ 4/22,  5/22,  6/22,  7/22],
        [ 8/38,  9/38, 10/38, 11/38],
        [12/54, 13/54, 14/54, 15/54]])
  • 1
  • 2
  • 3
  • 4

Zusammenfassung der Achsen- und Dimensionsänderungen

  • Achse=0: Arbeiten Sie entlang der ersten Dimension (Zeile), und die Summe der anderen Dimensionen bleibt nach der Summierung erhalten.
  • Achse=1: Arbeitet entlang der zweiten Dimension (Spalte) und die Summe der ersten und dritten Dimension bleibt nach der Summierung erhalten.
  • Achse=2: Arbeitet entlang der dritten Dimension (Tiefe), und die Summe der ersten beiden Dimensionen bleibt nach der Summierung erhalten.

verwenden keepdim=True Bei der Beibehaltung von Dimensionen beträgt die summierte Dimension 1.verwendenkeepdim=False Wenn , werden die summierten Dimensionen entfernt.

zweifeln:

Warum werden die Zeilen zu Spalten statt reshape(1, 4, 4)? Nur wenn reshape(4, 4) erscheinen die Zeilen als Zeilen?

Tensorstruktur

Sehen wir uns zunächst die Grundkonzepte an:

  • 2D-Tensor (Matrix): Hat Zeilen und Spalten.
  • 3D-Tensor: Es besteht aus mehreren zweidimensionalen Matrizen und kann als Stapel von Matrizen mit der Dimension „Tiefe“ betrachtet werden.

Beispiel 1: Zweidimensionaler Tensor (4, 4)

import torch
x = torch.arange(16).reshape(4, 4)
print(x)
  • 1
  • 2
  • 3

Ausgabe:

tensor([[ 0,  1,  2,  3],
        [ 4,  5,  6,  7],
        [ 8,  9, 10, 11],
        [12, 13, 14, 15]])
  • 1
  • 2
  • 3
  • 4

Die Form dieses Tensors ist (4, 4), stellt eine 4x4-Matrix dar:

  • OKist horizontal:

    • Zeile 0: [ 0, 1, 2, 3]
    • Linie 1: [ 4, 5, 6, 7]
    • Zeile 2: [ 8, 9, 10, 11]
    • Zeile 3: [12, 13, 14, 15]
  • Aufführenist vertikal:

    • Spalte 0: [ 0, 4, 8, 12]
    • Spalte 1: [ 1, 5, 9, 13]
    • Spalte 2: [ 2, 6, 10, 14]
    • Spalte 3: [ 3, 7, 11, 15]

Beispiel 2: Dreidimensionaler Tensor (1, 4, 4)

x = torch.arange(16).reshape(1, 4, 4)
print(x)
  • 1
  • 2

Ausgabe:

tensor([[[ 0,  1,  2,  3],
         [ 4,  5,  6,  7],
         [ 8,  9, 10, 11],
         [12, 13, 14, 15]]])
  • 1
  • 2
  • 3
  • 4

Die Form dieses Tensors ist (1, 4, 4), stellt einen dreidimensionalen 1x4x4-Tensor dar:

  • Die erste Dimension ist 1, Angabe der Chargengröße.
  • Die zweite Dimension ist 4, stellt die Anzahl der Zeilen dar (Zeilen pro Matrix).
  • Die dritte Dimension ist 4, stellt die Anzahl der Spalten (Spalten jeder Matrix) dar.

Erläuterung der Summe entlang der Achse

Summe entlang Achse 1 (zweite Dimension)
  1. Für einen zweidimensionalen Tensor (4, 4)
a = x.sum(axis=1, keepdim=True)
print(a)
  • 1
  • 2

Ausgabe:

tensor([[ 6],
        [22],
        [38],
        [54]])
  • 1
  • 2
  • 3
  • 4
  • Achse 1 ist die Richtung der Zeilen und die Elemente jeder Zeile werden summiert:
    • [0, 1, 2, 3] => 0+1+2+3 = 6
    • [4, 5, 6, 7] => 4+5+6+7 = 22
    • [8, 9, 10, 11] => 8+9+10+11 = 38
    • [12, 13, 14, 15] => 12+13+14+15 = 54
  1. Für dreidimensionale Tensoren (1, 4, 4)
a = x.sum(axis=1, keepdim=True)
print(a)
  • 1
  • 2

Ausgabe:

tensor([[[24, 28, 32, 36]]])
  • 1
  • Achse 1 ist die Zeilenrichtung der ersten Matrix. Summieren Sie die Elemente jeder Zeile:
    • [0, 1, 2, 3] + [4, 5, 6, 7] + [8, 9, 10, 11] + [12, 13, 14, 15]
    • Summe pro Spalte: 24 = 0+4+8+12, 28 = 1+5+9+13, 32 = 2+6+10+14, 36 = 3+7+11+15

Warum sieht es so aus, als ob „Zeilen zu Spalten werden“?

existieren (1, 4, 4) Im dreidimensionalen Tensor stellt die erste Dimension die Stapelgröße dar, sodass es den Anschein hat, dass jede 4x4-Matrix im Betrieb immer noch zweidimensional verarbeitet wird. Da jedoch eine Batch-Dimension hinzugefügt wird, verhält er sich bei der Summenoperation anders als ein zweidimensionaler Tensor.

Speziell:

  • Beim Summieren entlang der Achse 1 (der zweiten Dimension) summieren wir die Zeilen jeder Matrix.
  • Beim Summieren entlang der Achse 0 (der ersten Dimension) summieren wir die Chargenabmessungen.

Zusammenfassen

  • 2D-Tensor: Die Konzepte von Zeilen und Spalten sind intuitiv.
  • 3D-Tensor: Nach der Einführung der Batch-Dimension sehen die Zeilen- und Spaltenoperationen anders aus, tatsächlich werden sie jedoch weiterhin für jede zweidimensionale Matrix ausgeführt.
  • Beim Summieren entlang einer Achse ist es wichtig, die Dimensionen der Summe zu verstehen.