Función PyTorch torch.expand
Manual de referencia de Pytorch torchManual de referencia de Pytorch torch
torch.expandEs una función en PyTorch utilizada para expandir las dimensiones de un tensor. Expande el tensor replicando la vista, sin copiar realmente los datos.
El tensor expandido comparte los datos originales en la memoria como una vista, por lo que es una operación eficiente en memoria.
Definición de la función
torch.expand(*sizes) torch.expand(input, *sizes)
Parámetros:
input(Tensor): El tensor de entrada.*sizes(torch.Size o int): Tamaño objetivo. Puede haber una sola dimensión con valor -1, lo que indica que esa dimensión se mantiene sin cambios. Las dimensiones con valor 1 pueden expandirse a tamaños mayores.
Valor de retorno:
torch.Tensor: Devuelve la vista del tensor expandido.
Ejemplo de uso
Ejemplo
import torch
# Crear un tensor con una dimensión de tamaño 1
x = torch.tensor([[1], [2], [3]])
print("Tensor original:")
print(x)
print("Forma:", x.shape)
# Expandir a un tamaño mayor
y = x.expand(3, 4)
print("nExpandido:")
print(y)
print("Forma:", y.shape)
# Crear un tensor con una dimensión de tamaño 1
x = torch.tensor([[1], [2], [3]])
print("Tensor original:")
print(x)
print("Forma:", x.shape)
# Expandir a un tamaño mayor
y = x.expand(3, 4)
print("nExpandido:")
print(y)
print("Forma:", y.shape)
El resultado es:
原始张量:
tensor([[1],
[2],
[3]])
形状: torch.Size([3, 1])
扩展后:
tensor([[1, 1, 1, 1],
[2, 2, 2, 2],
[3, 3, 3, 3]])
形状: torch.Size([3, 4])
Ejemplo
import torch
# Usar -1 para mantener la dimensión sin cambios
x = torch.tensor([1, 2, 3, 4])
# Expandir a un tensor de 2x4
y = x.expand(2, -1)
print("Original:", x.shape)
print("Expandido:", y.shape)
print(y)
# Usar -1 para mantener la dimensión sin cambios
x = torch.tensor([1, 2, 3, 4])
# Expandir a un tensor de 2x4
y = x.expand(2, -1)
print("Original:", x.shape)
print("Expandido:", y.shape)
print(y)
El resultado es:
原始: torch.Size([4])
扩展后: torch.Size([2, 4])
tensor([[1, 2, 3, 4],
[1, 2, 3, 4]])
Ejemplo
import torch
# Escenario de aplicación del mecanismo de broadcasting
# Expandir un vector columna a una matriz
column = torch.randn(5, 1)
# Expandir para sumar con una matriz
matrix = torch.randn(5, 10)
# Broadcasting: el vector columna se expande automáticamente
result = matrix + column
print("Forma del vector columna:", column.shape)
print("Forma de la matriz:", matrix.shape)
print("Forma del resultado:", result.shape)
# Escenario de aplicación del mecanismo de broadcasting
# Expandir un vector columna a una matriz
column = torch.randn(5, 1)
# Expandir para sumar con una matriz
matrix = torch.randn(5, 10)
# Broadcasting: el vector columna se expande automáticamente
result = matrix + column
print("Forma del vector columna:", column.shape)
print("Forma de la matriz:", matrix.shape)
print("Forma del resultado:", result.shape)
El resultado es:
列向量形状: torch.Size([5, 1]) 矩阵形状: torch.Size([5, 10]) 结果形状: torch.Size([5, 10])
Ejemplo
import torch
# Expandir un tensor 2D a 3D
x = torch.tensor([[1, 2, 3],
[4, 5, 6]])
# Expandir la tercera dimensión
y = x.expand(2, 2, 3)
print("Forma original:", x.shape)
print("Forma expandida:", y.shape)
print("nTensor expandido:")
print(y)
# Verificar que los datos se comparten
print("nModificar el tensor original:")
x[0, 0] = 100
print("x[0,0]:", x[0, 0])
print("y[0,0,0]:", y[0, 0, 0])
# Expandir un tensor 2D a 3D
x = torch.tensor([[1, 2, 3],
[4, 5, 6]])
# Expandir la tercera dimensión
y = x.expand(2, 2, 3)
print("Forma original:", x.shape)
print("Forma expandida:", y.shape)
print("nTensor expandido:")
print(y)
# Verificar que los datos se comparten
print("nModificar el tensor original:")
x[0, 0] = 100
print("x[0,0]:", x[0, 0])
print("y[0,0,0]:", y[0, 0, 0])
El resultado es:
原始形状: torch.Size([2, 3])
扩展后形状: torch.Size([2, 2, 3])
扩展后的张量:
tensor([[[1, 2, 3],
[4, 5, 6]],
[[1, 2, 3],
[4, 5, 6]]])
修改原始张量:
x[0,0]: tensor(100)
y[0,0,0]: tensor(100)
Nota:torch.expandSolo se pueden expandir las dimensiones cuyo tamaño sea 1 a tamaños más grandes. No se pueden reducir ni expandir dimensiones de tamaño mayor que 1 a un tamaño distinto. El retorno es una vista, no una copia.