Partage de technologie

Compréhension de l'axe de pytorch

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

Combinez ces deux exemples pour expliquer en détail les changements d’axe dans différentes circonstances.
Comprendre les opérations dimensionnelles sur les tenseurs et la sommation le long d'axes spécifiques dans PyTorch prend un peu de temps. Analysons ces opérations étape par étape à travers deux exemples, expliquant en détail les changements d'axe dans différentes situations.

premier exemple

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
tenseur initial
tensor([[[ 0,  1,  2,  3],
         [ 4,  5,  6,  7],
         [ 8,  9, 10, 11],
         [12, 13, 14, 15]]])
  • 1
  • 2
  • 3
  • 4

C'est une forme de (1, 4, 4) de tenseurs. On peut le considérer comme un lot contenant une matrice 4x4.

Somme le long de l'axe 1
  1. x.sum(axis=1, keepdim=True)

Sommez le long de l'axe 1 (c'est-à-dire la direction de la deuxième dimension, 4), en conservant les dimensions.

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

La forme devient (1, 1, 4)

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

Somme le long de l'axe 1, aucune dimensionnalité préservée.

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

La forme devient (1, 4)

Somme le long de l'axe 0
  1. x.sum(axis=0, keepdim=True)

Somme le long de l'axe 0 (c'est-à-dire la direction de la première dimension, 1), en conservant les dimensions.

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

Étant donné que le tenseur d'origine n'a qu'un seul élément sur l'axe 0, le résultat est le même que le tenseur d'origine, avec une forme (1, 4, 4)

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

Somme le long de l'axe 0, la dimensionnalité n'est pas conservée.

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

La forme devient (4, 4)

Somme le long de l'axe 2
  1. x.sum(axis=2, keepdim=True)

Sommez le long de l'axe 2 (c'est-à-dire la troisième dimension, la direction de 4), en conservant les dimensions.

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

La forme devient (1, 4, 1)

point clé
  • keepdim=True Les dimensions additionnées seront conservées, le nombre de dimensions du résultat reste inchangé, mais la taille des dimensions additionnées devient 1.
  • keepdim=False Les dimensions additionnées seront supprimées et le nombre de dimensions dans le résultat sera réduit de 1.

deuxième exemple

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
tenseur initial
tensor([[ 0,  1,  2,  3],
        [ 4,  5,  6,  7],
        [ 8,  9, 10, 11],
        [12, 13, 14, 15]])
  • 1
  • 2
  • 3
  • 4

C'est une forme de (4, 4) de tenseurs.

Somme le long de l'axe 1
  1. x.sum(axis=1, keepdim=True)

Sommez le long de l'axe 1 (c'est-à-dire la direction de la deuxième dimension, 4), en conservant les dimensions.

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

La forme devient (4, 1)

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

Somme le long de l'axe 1, aucune dimensionnalité préservée.

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

La forme devient (4,)

Éléments divisés par somme de lignes
  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

Il s'agit de la somme de chaque élément divisée par sa ligne correspondante, ce qui donne :

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

Résumé des changements d'axe et de dimension

  • axe=0: Opérez le long de la première dimension (ligne), et la somme des autres dimensions reste après la sommation.
  • axe=1: Fonctionne le long de la deuxième dimension (colonne), et la somme des première et troisième dimensions reste après la sommation.
  • axe=2: Fonctionne le long de la troisième dimension (profondeur), et la somme des deux premières dimensions reste après la sommation.

utiliser keepdim=True Lors de la gestion des dimensions, la dimension additionnée devient 1.utiliserkeepdim=False Lorsque , les dimensions additionnées sont supprimées.

doute:

Pourquoi les lignes deviennent-elles des colonnes au lieu de reshape(1, 4, 4) ? Ce n'est que lorsque reshape(4, 4) que les lignes apparaissent sous forme de lignes ?

Structure tensorielle

Revoyons d’abord les concepts de base :

  • Tenseur 2D (matrice): Comporte des lignes et des colonnes.
  • Tenseur 3D: Il est composé de plusieurs matrices bidimensionnelles et peut être considéré comme un empilement de matrices avec une dimension « profondeur ».

Exemple 1 : Tenseur bidimensionnel (4, 4)

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

Sortir:

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

La forme de ce tenseur est (4, 4), représente une matrice 4x4 :

  • D'ACCORDest horizontal :

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

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

Exemple 2 : Tenseur tridimensionnel (1, 4, 4)

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

Sortir:

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

La forme de ce tenseur est (1, 4, 4), représente un tenseur tridimensionnel 1x4x4 :

  • La première dimension est 1, indiquant la taille du lot.
  • La deuxième dimension est 4, représente le nombre de lignes (lignes par matrice).
  • La troisième dimension est 4, représente le nombre de colonnes (colonnes de chaque matrice).

Explication de la somme le long de l'axe

Somme le long de l'axe 1 (deuxième dimension)
  1. Pour un tenseur bidimensionnel (4, 4)
a = x.sum(axis=1, keepdim=True)
print(a)
  • 1
  • 2

Sortir:

tensor([[ 6],
        [22],
        [38],
        [54]])
  • 1
  • 2
  • 3
  • 4
  • L'axe 1 est la direction des lignes, et les éléments de chaque ligne sont additionnés :
    • [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. Pour les tenseurs tridimensionnels (1, 4, 4)
a = x.sum(axis=1, keepdim=True)
print(a)
  • 1
  • 2

Sortir:

tensor([[[24, 28, 32, 36]]])
  • 1
  • L'axe 1 est la direction des lignes de la première matrice. Additionnez les éléments de chaque ligne :
    • [0, 1, 2, 3] + [4, 5, 6, 7] + [8, 9, 10, 11] + [12, 13, 14, 15]
    • Somme par colonne : 24 = 0+4+8+12, 28 = 1+5+9+13, 32 = 2+6+10+14, 36 = 3+7+11+15

Pourquoi cela ressemble-t-il à "les lignes deviennent des colonnes"

exister (1, 4, 4) Dans le tenseur tridimensionnel, la première dimension représente la taille du lot, il semble donc que chaque matrice 4x4 soit toujours traitée de manière bidimensionnelle lors du fonctionnement. Cependant, étant donné qu'une dimension de lot est ajoutée, elle se comporte différemment d'un tenseur bidimensionnel dans l'opération de somme.

Spécifiquement:

  • Lors de la somme le long de l'axe 1 (la deuxième dimension), nous additionnons les lignes de chaque matrice.
  • Lors de la somme le long de l'axe 0 (la première dimension), nous additionnons les dimensions du lot.

Résumer

  • Tenseur 2D: Les concepts de lignes et de colonnes sont intuitifs.
  • Tenseur 3D: Une fois la dimension par lots introduite, les opérations sur les lignes et les colonnes seront différentes, mais en fait elles sont toujours effectuées sur chaque matrice bidimensionnelle.
  • Lors de la somme le long d’un axe, il est essentiel de comprendre les dimensions de la somme.