Explication détaillée de la transformation de dimension du tenseur pytorch : afficher, presser, transposer

Table des matières

1 fonction d'affichage

1.1 Spécifier les dimensions transformées

1.2 Inférence automatique des dimensions transformées

1.3 Aplatir le tenseur en une seule dimension

2 fonctions de remodelage

2.1 Spécifier les dimensions transformées

2.2 Inférence automatique des dimensions converties

2.3 Aplatir le tenseur en une seule dimension

2.4 Utiliser la transformation tensor.reshape

3 fonctions de compression

3.1 torch.squeeze supprime toutes les dimensions qui sont 1

3.2 torch.squeeze spécifie la suppression des ombres

3.3 tensor.squeeze supprime la dimension de 1

4 fonctions de décompression

4.1 torch.unsqueeze spécifie dim pour insérer de nouvelles dimensions

4.2 tensor.unsqueeze spécifie dim pour insérer de nouvelles dimensions

5 fonctions de transposition

5.1 torch.transpose transpose la dimension spécifiée

5.2 tensor.transpose transpose la dimension spécifiée

6 fonction d'extension

7 fonctions de répétition

8 fonctions de permutation


 

Le changement de dimension du tenseur Pytorch est une opération courante et importante dans le processus de création de modèles. Cet article est déclenché par des applications pratiques et détaille les méthodes de changement de dimension couramment utilisées. Ces méthodes incluent l'affichage, le remodelage, la compression, la décompression, la transposition, etc.

1 fonction d'affichage

La fonction d'affichage de Pytorch est principalement utilisée pour la reconstruction des dimensions du Tensor, c'est-à-dire renvoyer un Tensor avec les mêmes données mais des dimensions différentes.

L'objet d'opération de la fonction d'affichage est de type Tensor et le type d'objet renvoyé est également de type Tensor.

    def view(self, *size: _int) -> Tensor: ...

Une représentation plus compréhensible :

view(参数a,参数b,…),其中,总的参数个数表示将张量重构后的维度。

1.1 Spécifier les dimensions transformées

Convertissez un tenseur unidimensionnel en un tenseur 3*8 dimensions en le spécifiant manuellement.

import torch

a1 = torch.tensor([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 
                   13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24])

a2 = a1.view(3, 8)
print(a1)
print(a2)
print(a1.shape)
print(a2.shape)

Le programme en cours d'exécution s'affiche comme suit :

tensor([ 1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17, 18,
        19, 20, 21, 22, 23, 24])
tensor([[ 1,  2,  3,  4,  5,  6,  7,  8],
        [ 9, 10, 11, 12, 13, 14, 15, 16],
        [17, 18, 19, 20, 21, 22, 23, 24]])
torch.Size([24])
torch.Size([3, 8])

1.2 Inférence automatique des dimensions transformées

Si un paramètre est -1, cela signifie que la dimension dépend d'autres dimensions et est complétée par Pytorch lui-même.

import torch

a3 = torch.tensor([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12,
                   13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24])

a4 = a3.view(4, -1)
a5 = a3.view(2, 3, -1)
a6 = a3.view(-1, 3, 2)

print(a3)
print(a4)
print(a5)
print(a6)
print(a3.shape)
print(a4.shape)
print(a5.shape)
print(a6.shape)

 Le programme en cours d'exécution s'affiche comme suit :

tensor([ 1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17, 18,
        19, 20, 21, 22, 23, 24])
tensor([[ 1,  2,  3,  4,  5,  6],
        [ 7,  8,  9, 10, 11, 12],
        [13, 14, 15, 16, 17, 18],
        [19, 20, 21, 22, 23, 24]])
tensor([[[ 1,  2,  3,  4],
         [ 5,  6,  7,  8],
         [ 9, 10, 11, 12]],
        [[13, 14, 15, 16],
         [17, 18, 19, 20],
         [21, 22, 23, 24]]])
tensor([[[ 1,  2],
         [ 3,  4],
         [ 5,  6]],
        [[ 7,  8],
         [ 9, 10],
         [11, 12]],
        [[13, 14],
         [15, 16],
         [17, 18]],
        [[19, 20],
         [21, 22],
         [23, 24]]])
torch.Size([24])
torch.Size([4, 6])
torch.Size([2, 3, 4])
torch.Size([4, 3, 2])

1.3 Aplatir le tenseur en une seule dimension

import torch

a7 = torch.tensor([[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12],
                   [13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24]])
a8 = a6.view(-1)
print(a7)
print(a8)
print(a7.shape)
print(a8.shape)

 Le programme en cours d'exécution s'affiche comme suit :

tensor([[ 1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12],
        [13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24]])
tensor([ 1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17, 18,
        19, 20, 21, 22, 23, 24])
torch.Size([2, 12])
torch.Size([24])

2 fonctions de remodelage

Renvoie un tenseur de la forme donnée qui a la même taille que les données du tenseur d'entrée. Si possible, une vue du tenseur d'entrée est renvoyée, sinon une copie est renvoyée.

torch.reshape(input, shape) → [Tensor]

Vous pouvez également utiliser reshape directement sur Tensor, sous la forme suivante :

tensor.reshape(shape) → [Tensor]

2.1 Spécifier les dimensions transformées

import torch

a1 = torch.tensor([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12])
a2 = torch.reshape(a1, (3, 4))
print(a1.shape)
print(a1)
print(a2.shape)
print(a2)

Le programme en cours d'exécution s'affiche comme suit :

torch.Size([12])
tensor([ 1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12])
torch.Size([3, 4])
tensor([[ 1,  2,  3,  4],
        [ 5,  6,  7,  8],
        [ 9, 10, 11, 12]])

2.2 Inférence automatique des dimensions converties

import torch

a3 = torch.tensor([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12])
a4 = torch.reshape(a1, (-1, 6))
print(a3.shape)
print(a3)
print(a4.shape)
print(a4)

Le programme en cours d'exécution s'affiche comme suit :

torch.Size([12])
tensor([ 1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12])
torch.Size([2, 6])
tensor([[ 1,  2,  3,  4,  5,  6],
        [ 7,  8,  9, 10, 11, 12]])

2.3 Aplatir le tenseur en une seule dimension

import torch

a5 = torch.tensor([[1, 2, 3, 4, 5, 6], [7, 8, 9, 10, 11, 12]])
a6 = torch.reshape(a1, (-1,))
print(a5.shape)
print(a5)
print(a6.shape)
print(a6)

Le programme en cours d'exécution s'affiche comme suit :

torch.Size([2, 6])
tensor([[ 1,  2,  3,  4,  5,  6],
        [ 7,  8,  9, 10, 11, 12]])
torch.Size([12])
tensor([ 1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12])

2.4 Utiliser la transformation tensor.reshape

improt torch

a7 = torch.tensor([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12])
a8 = a7.reshape(6, 2)
a9 = a7.reshape(-1, 3)
a10 = a9.reshape(-1)
print(a7.shape)
print(a7)
print(a8.shape)
print(a8)
print(a9.shape)
print(a9)
print(a10.shape)
print(a10)

Les résultats d'exécution sont affichés comme suit :

torch.Size([12])
tensor([ 1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12])
torch.Size([6, 2])
tensor([[ 1,  2],
        [ 3,  4],
        [ 5,  6],
        [ 7,  8],
        [ 9, 10],
        [11, 12]])
torch.Size([4, 3])
tensor([[ 1,  2,  3],
        [ 4,  5,  6],
        [ 7,  8,  9],
        [10, 11, 12]])
torch.Size([12])
tensor([ 1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12])

3 fonctions de compression

Supprimez toutes les dimensions avec des données de dimension de 1 dans le tenseur d'entrée. Dim est spécifié. Si la valeur de la dimension correspondante de dim n'est pas 1, elle restera inchangée. Si elle est 1, la dimension sera supprimée.

 torch.squeeze(input, dim=None) → [Tensor]

 Vous pouvez également utiliser squeeze directement sur le tenseur sous la forme suivante :

 tensor.squeeze(dim=None) → [Tensor]

3.1 torch.squeeze supprime toutes les dimensions qui sont 1

import torch

a1 = torch.tensor([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12])
a2 = a1.reshape(3, 1, 4)
a3 = torch.squeeze(a2)

print(a1.shape)
print(a1)
print(a2.shape)
print(a2)
print(a3.shape)
print(a3)

 Les résultats d'exécution sont affichés comme suit : (la deuxième dimension de a2 est supprimée)

torch.Size([12])
tensor([ 1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12])
torch.Size([3, 1, 4])
tensor([[[ 1,  2,  3,  4]],

        [[ 5,  6,  7,  8]],

        [[ 9, 10, 11, 12]]])
torch.Size([3, 4])
tensor([[ 1,  2,  3,  4],
        [ 5,  6,  7,  8],
        [ 9, 10, 11, 12]])

3.2 torch.squeeze spécifie la dimension de dim supprimée à 1

import torch

a4 = torch.tensor([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12])
a5 = a1.reshape(3, 1, 4)
a6 = torch.squeeze(a5, 0)
a7 = torch.squeeze(a5, 1)

print(a4.shape)
print(a4)
print(a5.shape)
print(a5)
print(a6.shape)
print(a6)
print(a7.shape)
print(a7)

Les résultats d'exécution sont les suivants : (la première dimension de a5 n'est pas 1, elle reste donc inchangée ; la deuxième dimension de a5 est 1, elle est donc supprimée)

torch.Size([12])
tensor([ 1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12])
torch.Size([3, 1, 4])
tensor([[[ 1,  2,  3,  4]],

        [[ 5,  6,  7,  8]],

        [[ 9, 10, 11, 12]]])
torch.Size([3, 1, 4])
tensor([[[ 1,  2,  3,  4]],

        [[ 5,  6,  7,  8]],

        [[ 9, 10, 11, 12]]])
torch.Size([3, 4])
tensor([[ 1,  2,  3,  4],
        [ 5,  6,  7,  8],
        [ 9, 10, 11, 12]])

3.3 tensor.squeeze spécifie la dimension sur laquelle dim est supprimé à 1

import torch

a8 = torch.tensor([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12])
a9 = a8.reshape(3, 1, 4)
a10 = a9.squeeze()
a11 = a9.squeeze(0)
a12 = a9.squeeze(1)

print(a8.shape)
print(a8)
print(a9.shape)
print(a9)
print(a10.shape)
print(a10)
print(a11.shape)
print(a11)
print(a12.shape)
print(a12)

Les résultats d'exécution sont affichés comme suit :

torch.Size([12])
tensor([ 1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12])
torch.Size([3, 1, 4])
tensor([[[ 1,  2,  3,  4]],

        [[ 5,  6,  7,  8]],

        [[ 9, 10, 11, 12]]])
torch.Size([3, 4])
tensor([[ 1,  2,  3,  4],
        [ 5,  6,  7,  8],
        [ 9, 10, 11, 12]])
torch.Size([3, 1, 4])
tensor([[[ 1,  2,  3,  4]],

        [[ 5,  6,  7,  8]],

        [[ 9, 10, 11, 12]]])
torch.Size([3, 4])
tensor([[ 1,  2,  3,  4],
        [ 5,  6,  7,  8],
        [ 9, 10, 11, 12]])

4 fonctions de décompression

Insère une nouvelle dimension à la position de dimension donnée. La valeur de la dimension est 1. La plage de dim est [-dim()-1, dim()+1), y compris le début et non la fin.

torch.unsqueeze(input, dim) → [Tensor]

 Vous pouvez également utiliser unsqueeze directement sur le tenseur sous la forme suivante :

torch.unsqueeze(dim) → [Tensor]

4.1 torch.unsqueeze spécifie dim pour insérer de nouvelles dimensions

import torch

a1 = torch.tensor([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12])
a2 = a1.reshape(3, 4)
a3 = torch.unsqueeze(a2, 0)
a4 = torch.unsqueeze(a2, 2)

print(a1.shape)
print(a1)
print(a2.shape)
print(a2)
print(a3.shape)
print(a3)
print(a4.shape)
print(a4)

Les résultats d'exécution sont affichés comme suit :

torch.Size([12])
tensor([ 1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12])
torch.Size([3, 4])
tensor([[ 1,  2,  3,  4],
        [ 5,  6,  7,  8],
        [ 9, 10, 11, 12]])
torch.Size([1, 3, 4])
tensor([[[ 1,  2,  3,  4],
         [ 5,  6,  7,  8],
         [ 9, 10, 11, 12]]])
torch.Size([3, 4, 1])
tensor([[[ 1],
         [ 2],
         [ 3],
         [ 4]],

        [[ 5],
         [ 6],
         [ 7],
         [ 8]],

        [[ 9],
         [10],
         [11],
         [12]]])

4.2 tensor.unsqueeze spécifie dim pour insérer de nouvelles dimensions

import torch

a5 = torch.tensor([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12])
a6 = a5.reshape(3, 4)
a7 = a6.unsqueeze(0)
a8 = a6.unsqueeze(1)

print(a5.shape)
print(a5)
print(a6.shape)
print(a6)
print(a7.shape)
print(a7)
print(a8.shape)
print(a8)

Les résultats d'exécution sont affichés comme suit :

tensor([ 1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12])
torch.Size([3, 4])
tensor([[ 1,  2,  3,  4],
        [ 5,  6,  7,  8],
        [ 9, 10, 11, 12]])
torch.Size([1, 3, 4])
tensor([[[ 1,  2,  3,  4],
         [ 5,  6,  7,  8],
         [ 9, 10, 11, 12]]])
torch.Size([3, 1, 4])
tensor([[[ 1,  2,  3,  4]],

        [[ 5,  6,  7,  8]],

        [[ 9, 10, 11, 12]]])

5 fonctions de transposition

Renvoie la transposition du tenseur d'entrée, des positions d'échange dim0 et dim1.

torch.transpose(input, dim0, dim1) → [Tensor]

  Vous pouvez également utiliser unsqueeze directement sur le tenseur sous la forme suivante :

tensor.transpose(dim0, dim1) → [Tensor]

paramètre:

  • entrée  ([ Tenseur ] tenseur d'entrée
  • dim0  ([ int ] première dimension à transposer
  • dim1  ([ int ] Deuxième dimension à transposer

5.1 torch.transpose transpose la dimension spécifiée

import torch

a1 = torch.tensor([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12])
a2 = a1.reshape(4, 3, 1)
a3 = torch.transpose(a2, 0, 1)
a4 = torch.transpose(a2, 1, 2)

print(a1.shape)
print(a1)
print(a2.shape)
print(a2)
print(a3.shape)
print(a3)
print(a4.shape)
print(a4)

Les résultats d'exécution sont affichés comme suit :

torch.Size([12])
tensor([ 1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12])
torch.Size([4, 3, 1])
tensor([[[ 1],
         [ 2],
         [ 3]],
        [[ 4],
         [ 5],
         [ 6]],
        [[ 7],
         [ 8],
         [ 9]],
        [[10],
         [11],
         [12]]])
torch.Size([3, 4, 1])
tensor([[[ 1],
         [ 4],
         [ 7],
         [10]],
        [[ 2],
         [ 5],
         [ 8],
         [11]],
        [[ 3],
         [ 6],
         [ 9],
         [12]]])
torch.Size([4, 1, 3])
tensor([[[ 1,  2,  3]],
        [[ 4,  5,  6]],
        [[ 7,  8,  9]],
        [[10, 11, 12]]])

5.2 tensor.transpose transpose la dimension spécifiée

import torch

a5 = torch.tensor([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12])
a6 = a1.reshape(4, 3, 1)
a7 = a6.transpose(0, 1)
a8 = a6.transpose(1, 2)

print(a5.shape)
print(a5)
print(a6.shape)
print(a6)
print(a7.shape)
print(a7)
print(a8.shape)
print(a8)

Les résultats d'exécution sont affichés comme suit :

torch.Size([12])
tensor([ 1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12])
torch.Size([4, 3, 1])
tensor([[[ 1],
         [ 2],
         [ 3]],
        [[ 4],
         [ 5],
         [ 6]],
        [[ 7],
         [ 8],
         [ 9]],
        [[10],
         [11],
         [12]]])
torch.Size([3, 4, 1])
tensor([[[ 1],
         [ 4],
         [ 7],
         [10]],
        [[ 2],
         [ 5],
         [ 8],
         [11]],
        [[ 3],
         [ 6],
         [ 9],
         [12]]])
torch.Size([4, 1, 3])
tensor([[[ 1,  2,  3]],
        [[ 4,  5,  6]],
        [[ 7,  8,  9]],
        [[10, 11, 12]]])

6 fonction d'extension

Renvoie une nouvelle vue du tenseur dans laquelle une taille de dimension est étendue à une taille plus grande. Si la taille de dimension actuelle est -1, cela signifie que la taille de dimension actuelle reste inchangée.

Les tenseurs peuvent également être étendus à davantage de dimensions, et de nouveaux seront ajoutés au premier plan. Pour les nouvelles dimensions, la taille ne peut pas être définie sur -1 ;

L'extension d'un tenseur n'alloue pas de nouvelle mémoire mais crée uniquement une nouvelle vue sur le tenseur existant. Toute dimension de taille 1 peut être étendue à n'importe quelle valeur sans allouer de nouvelle mémoire.

Tensor.expand( *sizes) → [Tensor]

paramètre:

  • tailles  ( torch.Size ou [ int ] – spécifie le nombre de fois où copier la dimension

 

import torch

a1 = torch.tensor([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12])
a2 = a1.reshape(3, 1, 4, 1)

# 维度为 1 的 size 可以扩展成什么任意的 size
a3 = a2.expand(3, 5, 4, 2)

# -1 表示对应的维度size不变,但如果第一个维度3扩展成6则会报错,维度不为1不能扩展
a4 = a2.expand(-1, 5, -1, -1)

# 可以扩展新的维度,但只会放到最前面,不能放到后面(会报错)且不能设置为-1
a5 = a2.expand(2, -1, 5, -1, -1)

print(a1.shape)
print(a1)
print(a2.shape)
print(a2)
print(a3.shape)
print(a3)
print(a4.shape)
print(a4)
print(a5.shape)
print(a5)

Les résultats en cours d'exécution sont affichés comme suit : (Si la dimension n'est pas 1, elle ne peut pas être développée)

torch.Size([12])
tensor([ 1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12])
torch.Size([3, 1, 4, 1])
tensor([[[[ 1],
          [ 2],
          [ 3],
          [ 4]]],
        [[[ 5],
          [ 6],
          [ 7],
          [ 8]]],
        [[[ 9],
          [10],
          [11],
          [12]]]])
torch.Size([3, 5, 4, 2])
tensor([[[[ 1,  1],
          [ 2,  2],
          [ 3,  3],
          [ 4,  4]],
         [[ 1,  1],
          [ 2,  2],
          [ 3,  3],
          [ 4,  4]],
         [[ 1,  1],
          [ 2,  2],
          [ 3,  3],
          [ 4,  4]],
         [[ 1,  1],
          [ 2,  2],
          [ 3,  3],
          [ 4,  4]],
         [[ 1,  1],
          [ 2,  2],
          [ 3,  3],
          [ 4,  4]]],
        [[[ 5,  5],
          [ 6,  6],
          [ 7,  7],
          [ 8,  8]],
         [[ 5,  5],
          [ 6,  6],
          [ 7,  7],
          [ 8,  8]],
         [[ 5,  5],
          [ 6,  6],
          [ 7,  7],
          [ 8,  8]],
         [[ 5,  5],
          [ 6,  6],
          [ 7,  7],
          [ 8,  8]],
         [[ 5,  5],
          [ 6,  6],
          [ 7,  7],
          [ 8,  8]]],
        [[[ 9,  9],
          [10, 10],
          [11, 11],
          [12, 12]],
         [[ 9,  9],
          [10, 10],
          [11, 11],
          [12, 12]],
         [[ 9,  9],
          [10, 10],
          [11, 11],
          [12, 12]],
         [[ 9,  9],
          [10, 10],
          [11, 11],
          [12, 12]],
         [[ 9,  9],
          [10, 10],
          [11, 11],
          [12, 12]]]])
torch.Size([3, 5, 4, 1])
tensor([[[[ 1],
          [ 2],
          [ 3],
          [ 4]],
         [[ 1],
          [ 2],
          [ 3],
          [ 4]],
         [[ 1],
          [ 2],
          [ 3],
          [ 4]],
         [[ 1],
          [ 2],
          [ 3],
          [ 4]],
         [[ 1],
          [ 2],
          [ 3],
          [ 4]]],
        [[[ 5],
          [ 6],
          [ 7],
          [ 8]],
         [[ 5],
          [ 6],
          [ 7],
          [ 8]],
         [[ 5],
          [ 6],
          [ 7],
          [ 8]],
         [[ 5],
          [ 6],
          [ 7],
          [ 8]],
         [[ 5],
          [ 6],
          [ 7],
          [ 8]]],
        [[[ 9],
          [10],
          [11],
          [12]],
         [[ 9],
          [10],
          [11],
          [12]],
         [[ 9],
          [10],
          [11],
          [12]],
         [[ 9],
          [10],
          [11],
          [12]],
         [[ 9],
          [10],
          [11],
          [12]]]])
torch.Size([2, 3, 5, 4, 1])
tensor([[[[[ 1],
           [ 2],
           [ 3],
           [ 4]],
          [[ 1],
           [ 2],
           [ 3],
           [ 4]],
          [[ 1],
           [ 2],
           [ 3],
           [ 4]],
          [[ 1],
           [ 2],
           [ 3],
           [ 4]],
          [[ 1],
           [ 2],
           [ 3],
           [ 4]]],
         [[[ 5],
           [ 6],
           [ 7],
           [ 8]],
          [[ 5],
           [ 6],
           [ 7],
           [ 8]],
          [[ 5],
           [ 6],
           [ 7],
           [ 8]],
          [[ 5],
           [ 6],
           [ 7],
           [ 8]],
          [[ 5],
           [ 6],
           [ 7],
           [ 8]]],
         [[[ 9],
           [10],
           [11],
           [12]],
          [[ 9],
           [10],
           [11],
           [12]],
          [[ 9],
           [10],
           [11],
           [12]],
          [[ 9],
           [10],
           [11],
           [12]],
          [[ 9],
           [10],
           [11],
           [12]]]],
        [[[[ 1],
           [ 2],
           [ 3],
           [ 4]],
          [[ 1],
           [ 2],
           [ 3],
           [ 4]],
          [[ 1],
           [ 2],
           [ 3],
           [ 4]],
          [[ 1],
           [ 2],
           [ 3],
           [ 4]],
          [[ 1],
           [ 2],
           [ 3],
           [ 4]]],
         [[[ 5],
           [ 6],
           [ 7],
           [ 8]],
          [[ 5],
           [ 6],
           [ 7],
           [ 8]],
          [[ 5],
           [ 6],
           [ 7],
           [ 8]],
          [[ 5],
           [ 6],
           [ 7],
           [ 8]],
          [[ 5],
           [ 6],
           [ 7],
           [ 8]]],
         [[[ 9],
           [10],
           [11],
           [12]],
          [[ 9],
           [10],
           [11],
           [12]],
          [[ 9],
           [10],
           [11],
           [12]],
          [[ 9],
           [10],
           [11],
           [12]],
          [[ 9],
           [10],
           [11],
           [12]]]]])

7 fonctions de répétition

Copiez le tenseur selon les dimensions spécifiées.Différente de l'expansion,cette méthode copiera les données du tenseur d'origine.

Tensor.repeat( *sizes) → [Tensor]

paramètre:

  • tailles  ( torch.Size ou [ int ] – spécifie le nombre de fois où copier la dimension 
import torch

a1 = torch.tensor([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12])
print(a1.storage().data_ptr())
a2 = a1.reshape(3, 1, 4)
print(a2.storage().data_ptr())
a3 = a2.expand(3, 3, -1)

# expand 操作后,张量的内存地址没变
print(a3.storage().data_ptr())

a4 = a2.repeat(2, 4, 1)

# repeat 操作后,张量的内存地址会改变
print(a4.storage().data_ptr())

print(a1.shape)
print(a1)
print(a2.shape)
print(a2)
print(a3.shape)
print(a3)
print(a4.shape)

 Les résultats d'exécution sont affichés comme suit :

1974461518528
1974461518528
1974461518528
1974462302208
torch.Size([12])
tensor([ 1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12])
torch.Size([3, 1, 4])
tensor([[[ 1,  2,  3,  4]],
        [[ 5,  6,  7,  8]],
        [[ 9, 10, 11, 12]]])
torch.Size([3, 3, 4])
tensor([[[ 1,  2,  3,  4],
         [ 1,  2,  3,  4],
         [ 1,  2,  3,  4]],
        [[ 5,  6,  7,  8],
         [ 5,  6,  7,  8],
         [ 5,  6,  7,  8]],
        [[ 9, 10, 11, 12],
         [ 9, 10, 11, 12],
         [ 9, 10, 11, 12]]])
torch.Size([6, 4, 4])
tensor([[[ 1,  2,  3,  4],
         [ 1,  2,  3,  4],
         [ 1,  2,  3,  4],
         [ 1,  2,  3,  4]],
        [[ 5,  6,  7,  8],
         [ 5,  6,  7,  8],
         [ 5,  6,  7,  8],
         [ 5,  6,  7,  8]],
        [[ 9, 10, 11, 12],
         [ 9, 10, 11, 12],
         [ 9, 10, 11, 12],
         [ 9, 10, 11, 12]],
        [[ 1,  2,  3,  4],
         [ 1,  2,  3,  4],
         [ 1,  2,  3,  4],
         [ 1,  2,  3,  4]],
        [[ 5,  6,  7,  8],
         [ 5,  6,  7,  8],
         [ 5,  6,  7,  8],
         [ 5,  6,  7,  8]],
        [[ 9, 10, 11, 12],
         [ 9, 10, 11, 12],
         [ 9, 10, 11, 12],
         [ 9, 10, 11, 12]]])

8 fonctions de permutation

Renvoie le tenseur réorganisé

torch.permute(input, dims) → [Tensor]

 Vous pouvez également utiliser la permute directement sur le tenseur, sous la forme suivante : 

tensor.permute(dims) → [Tensor]

paramètre:

  • entrée  ([ Tensor ] Tenseur pour réorganiser
  • dims  ( tuple de python:int ) tableau d'index de dimension qui doit être réorganisé

 

import torch

a1 = torch.tensor([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12])
a2 = a1.reshape(3, 1, 4)
a3 = torch.permute(a2, (2, 0, 1))
a4 = torch.permute(a2, (1, 0, 2))
a5 = a2.permute(1, 2, 0)

print(a1.shape)
print(a1)
print(a2.shape)
print(a2)
print(a3.shape)
print(a3)
print(a4.shape)
print(a4)
print(a5.shape)
print(a5)

Les résultats d'exécution sont affichés comme suit :

torch.Size([12])
tensor([ 1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12])
torch.Size([3, 1, 4])
tensor([[[ 1,  2,  3,  4]],
        [[ 5,  6,  7,  8]],
        [[ 9, 10, 11, 12]]])
torch.Size([4, 3, 1])
tensor([[[ 1],
         [ 5],
         [ 9]],
        [[ 2],
         [ 6],
         [10]],
        [[ 3],
         [ 7],
         [11]],
        [[ 4],
         [ 8],
         [12]]])
torch.Size([1, 3, 4])
tensor([[[ 1,  2,  3,  4],
         [ 5,  6,  7,  8],
         [ 9, 10, 11, 12]]])
torch.Size([1, 4, 3])
tensor([[[ 1,  5,  9],
         [ 2,  6, 10],
         [ 3,  7, 11],
         [ 4,  8, 12]]])

 

 

Guess you like

Origin blog.csdn.net/lsb2002/article/details/132905346