Función torch.reshape de PyTorch
Manual de referencia de Pytorch torch
torch.reshapeEs una función de PyTorch utilizada para cambiar la forma de un tensor. Devuelve un nuevo tensor con el mismo número de elementos que el tensor original, pero con una forma diferente.
Esta es una operación muy común en el aprendizaje profundo, utilizada para ajustar la forma de los datos según los requisitos de entrada de las diferentes capas.
Definición de la función
torch.reshape(input, shape)
Parámetros:
input(Tensor): el tensor de entrada.shape(tuple o int): la forma objetivo. El número de elementos en la forma debe ser igual al número de elementos del tensor de entrada. Se puede usar-1para que PyTorch infiera la dimensión automáticamente.
Valor de retorno:
torch.Tensor: devuelve una vista del tensor con la forma cambiada.
Ejemplos de uso
Ejemplo 1: remodelar (reshape) un tensor unidimensional a bidimensional
Ejemplo
import torch
# Crear un tensor unidimensional
x = torch.arange(12)
print("Forma original:", x.shape)
print(x)
# Cambiar a un tensor bidimensional de 3x4
y = torch.reshape(x, (3, 4))
print("Nueva forma:", y.shape)
print(y)
# Crear un tensor unidimensional
x = torch.arange(12)
print("Forma original:", x.shape)
print(x)
# Cambiar a un tensor bidimensional de 3x4
y = torch.reshape(x, (3, 4))
print("Nueva forma:", y.shape)
print(y)
La salida es:
原始形状: 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]])
Ejemplo 2: usar -1 para inferir dimensiones automáticamente
Ejemplo
import torch
# Crear un tensor tridimensional
x = torch.randn(2, 3, 4)
print("Forma original:", x.shape)
# Usar -1 para inferir automáticamente la última dimensión
y = torch.reshape(x, (2, -1))
print("Nueva forma:", y.shape)
# Crear un tensor tridimensional
x = torch.randn(2, 3, 4)
print("Forma original:", x.shape)
# Usar -1 para inferir automáticamente la última dimensión
y = torch.reshape(x, (2, -1))
print("Nueva forma:", y.shape)
La salida es:
原始形状: torch.Size([2, 3, 4]) 新形状: torch.Size([2, 12])
Ejemplo 3: aplanar a bidimensional
Ejemplo
import torch
# Crear un tensor de cuatro dimensiones (datos típicos de imágenes por lotes)
x = torch.randn(32, 3, 224, 224) # Tamaño de lote 32, canales 3, alto y ancho 224
print("Forma original:", x.shape)
# Aplanar a (tamaño de lote, otros)
y = torch.reshape(x, (32, -1))
print("Forma después del aplanado:", y.shape)
# Crear un tensor de cuatro dimensiones (datos típicos de imágenes por lotes)
x = torch.randn(32, 3, 224, 224) # Tamaño de lote 32, canales 3, alto y ancho 224
print("Forma original:", x.shape)
# Aplanar a (tamaño de lote, otros)
y = torch.reshape(x, (32, -1))
print("Forma después del aplanado:", y.shape)
La salida es:
原始形状: torch.Size([32, 3, 224, 224]) 展平后形状: torch.Size([32, 150528])
Esto se usa a menudo antes de introducir los datos de imagen en una capa totalmente conectada.
Ejemplo 4: diferencia entre reshape y view
Ejemplo
import torch
# Crear un tensor contiguo
x = torch.arange(12).reshape(3, 4)
# reshape puede devolver una vista o una copia
y = torch.reshape(x, (4, 3))
print("y es una vista de x:", y.is_contiguous() or y.data_ptr() == x.data_ptr())
# Crear un tensor contiguo
x = torch.arange(12).reshape(3, 4)
# reshape puede devolver una vista o una copia
y = torch.reshape(x, (4, 3))
print("y es una vista de x:", y.is_contiguous() or y.data_ptr() == x.data_ptr())
torch.reshapepuede manejar tensores no contiguos, mientras quetensor.view()requiere que el tensor sea contiguo.
Notas
torch.reshapeEl tensor devuelto puede ser una vista (view) de los datos originales o una copia (copy), dependiendo del diseño de memoria.- Si se necesita garantizar que se devuelva una vista, se puede usar
tensor.view(), pero hay que asegurarse de que el tensor sea contiguo. - El número total de elementos de la forma debe ser el mismo que el número de elementos del tensor original.
Otras extensiones