Fonction torch.reshape de PyTorch
Manuel de référence Pytorch torch
torch.reshapeIl s'agit d'une fonction de PyTorch utilisée pour modifier la forme d'un tenseur. Elle renvoie un nouveau tenseur ayant le même nombre d'éléments que le tenseur d'origine, mais avec une forme différente.
Il s'agit d'une opération très courante en apprentissage profond, utilisée pour ajuster la forme des données afin de répondre aux exigences d'entrée des différentes couches.
Définition de fonction
torch.reshape(input, shape)
Parameters:
input(Tensor) : Le tenseur d'entrée.shape(tuple ou int) : La forme cible. Le nombre d'éléments dans la forme doit être égal au nombre d'éléments dans le tenseur d'entrée. Vous pouvez utiliser-1pour laisser PyTorch déduire automatiquement la dimension.
Valeur de retour:
torch.Tensor: Renvoie une vue de tenseur avec la forme modifiée.
Exemples d'utilisation
Exemple 1 : Remodeler un tenseur 1D en 2D
Exemple
import torch
# Créer un tenseur 1D
x = torch.arange(12)
print("Forme d'origine :", x.shape)
print(x)
# Changer en un tenseur 2D de 3x4
y = torch.reshape(x, (3, 4))
print("Nouvelle forme :", y.shape)
print(y)
# Créer un tenseur 1D
x = torch.arange(12)
print("Forme d'origine :", x.shape)
print(x)
# Changer en un tenseur 2D de 3x4
y = torch.reshape(x, (3, 4))
print("Nouvelle forme :", y.shape)
print(y)
La sortie est :
原始形状: torch.Size([12])
tensor([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11])
新形状: torch.Size([3, 4])
tensor([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
Exemple 2 : Utilisation de -1 pour déduire automatiquement les dimensions
Exemple
import torch
# Créer un tenseur 3D
x = torch.randn(2, 3, 4)
print("Forme d'origine :", x.shape)
# Utiliser -1 pour déduire automatiquement la dernière dimension
y = torch.reshape(x, (2, -1))
print("Nouvelle forme :", y.shape)
# Créer un tenseur 3D
x = torch.randn(2, 3, 4)
print("Forme d'origine :", x.shape)
# Utiliser -1 pour déduire automatiquement la dernière dimension
y = torch.reshape(x, (2, -1))
print("Nouvelle forme :", y.shape)
La sortie est :
原始形状: torch.Size([2, 3, 4]) 新形状: torch.Size([2, 12])
Exemple 3 : Aplatir en 2D
Exemple
import torch
# Créer un tenseur 4D (données d'images par lots typiques)
x = torch.randn(32, 3, 224, 224) # Taille du lot 32, canaux 3, hauteur et largeur 224
print("Forme d'origine :", x.shape)
# Aplatir en (taille du lot, autre)
y = torch.reshape(x, (32, -1))
print("Forme après aplatissement :", y.shape)
# Créer un tenseur 4D (données d'images par lots typiques)
x = torch.randn(32, 3, 224, 224) # Taille du lot 32, canaux 3, hauteur et largeur 224
print("Forme d'origine :", x.shape)
# Aplatir en (taille du lot, autre)
y = torch.reshape(x, (32, -1))
print("Forme après aplatissement :", y.shape)
La sortie est :
原始形状: torch.Size([32, 3, 224, 224]) 展平后形状: torch.Size([32, 150528])
Ceci est souvent utilisé avant d'alimenter des données d'images dans des couches entièrement connectées.
Exemple 4 : Différence entre reshape et view
Exemple
import torch
# Créer un tenseur contigu
x = torch.arange(12).reshape(3, 4)
# reshape peut renvoyer une vue ou une copie
y = torch.reshape(x, (4, 3))
print("y est une vue de x :", y.is_contiguous() or y.data_ptr() == x.data_ptr())
# Créer un tenseur contigu
x = torch.arange(12).reshape(3, 4)
# reshape peut renvoyer une vue ou une copie
y = torch.reshape(x, (4, 3))
print("y est une vue de x :", y.is_contiguous() or y.data_ptr() == x.data_ptr())
torch.reshapepeut gérer des tenseurs non contigus, tandis quetensor.view()exige que le tenseur soit contigu.
Notes
torch.reshapeLe tenseur renvoyé peut être une vue des données d'origine ou une copie, selon la disposition de la mémoire.- Si vous devez garantir une vue renvoyée, vous pouvez utiliser
tensor.view(), mais assurez-vous que le tenseur est contigu. - Le nombre total d'éléments dans la forme doit être identique au nombre d'éléments du tenseur d'origine.
Autres extensions