El método PyTorch torch.stack() une (concatena) una secuencia de tensores (dos o más tensores) a lo largo de una nueva dimensión. Inserta una nueva dimensión y concatena los tensores a lo largo de esa dimensión. Este método une los tensores con las mismas dimensiones y forma. También podríamos usar torch.cat() para unir tensores. Pero aquí analizamos el método torch.stack().
Sintaxis: torch.stack(tensores, dim=0)
Argumentos:
- tensores: Es una secuencia de tensores de la misma forma y dimensiones
- dim: Es la dimensión a insertar. Es un número entero entre 0 y el número de dimensiones de los tensores de entrada.
Devoluciones: Devuelve el tensor concatenado a lo largo de una nueva dimensión.
Entendamos el método torch.stack() con la ayuda de algunos ejemplos de Python 3.
Ejemplo 1:
En el siguiente ejemplo de Python, unimos dos tensores unidimensionales usando el método torch.stack() .
Python3
# Python 3 program to demonstrate torch.stack() method # for two one dimensional tensors # importing torch import torch # creating tensors x = torch.tensor([1.,3.,6.,10.]) y = torch.tensor([2.,7.,9.,13.]) # printing above created tensors print("Tensor x:", x) print("Tensor y:", y) # join above tensor using "torch.stack()" print("join tensors:") t = torch.stack((x,y)) # print final tensor after join print(t) print("join tensors dimension 0:") t = torch.stack((x,y), dim = 0) print(t) print("join tensors dimension 1:") t = torch.stack((x,y), dim = 1) print(t)
Producción:
Tensor x: tensor([ 1., 3., 6., 10.]) Tensor y: tensor([ 2., 7., 9., 13.]) join tensors: tensor([[ 1., 3., 6., 10.], [ 2., 7., 9., 13.]]) join tensors dimension 0: tensor([[ 1., 3., 6., 10.], [ 2., 7., 9., 13.]]) join tensors dimension 1: tensor([[ 1., 2.], [ 3., 7.], [ 6., 9.], [10., 13.]])
Explicación: En el código anterior, los tensores x e y son unidimensionales, cada uno de los cuales tiene cuatro elementos. El tensor concatenado final es un tensor 2D. Como la dimensión es 1, podemos apilar los tensores con dimensiones 0 y 1. Cuando dim =0 los tensores se apilan aumentando el número de filas. Cuando dim = 1, los tensores se transponen y se apilan a lo largo de la columna.
Ejemplo 2:
En el siguiente ejemplo de Python, unimos dos tensores unidimensionales usando el método torch.stack() .
Python3
# Python 3 program to demonstrate torch.stack() method # for two 2D tensors. # importing torch import torch # creating tensors x = torch.tensor([[1., 3., 6.], [10., 13., 20.]]) y = torch.tensor([[2., 7., 9.], [14., 21., 34.]]) # printing above created tensors print("Tensor x:\n", x) print("Tensor y:\n", y) # join above tensor using "torch.stack()" print("join tensors") t = torch.stack((x, y)) # print final tensor after join print(t) print("join tensors in dimension 0:") t = torch.stack((x, y), 0) print(t) print("join tensors in dimension 1:") t = torch.stack((x, y), 1) print(t) print("join tensors in dimension 2:") t = torch.stack((x, y), 2) print(t)
Producción:
Tensor x: tensor([[ 1., 3., 6.], [10., 13., 20.]]) Tensor y: tensor([[ 2., 7., 9.], [14., 21., 34.]]) join tensors tensor([[[ 1., 3., 6.], [10., 13., 20.]], [[ 2., 7., 9.], [14., 21., 34.]]]) join tensors in dimension 0: tensor([[[ 1., 3., 6.], [10., 13., 20.]], [[ 2., 7., 9.], [14., 21., 34.]]]) join tensors in dimension 1: tensor([[[ 1., 3., 6.], [ 2., 7., 9.]], [[10., 13., 20.], [14., 21., 34.]]]) join tensors in dimension 2: tensor([[[ 1., 2.], [ 3., 7.], [ 6., 9.]], [[10., 14.], [13., 21.], [20., 34.]]])
Explicación: En el código anterior, x e y son tensores bidimensionales. Observe que el tensor final es un tensor tridimensional. Como la dimensión de cada tensor de entrada es 2, podemos apilar los tensores con dimensiones 0 y 2. Vea las diferencias entre los tensores de salida finales con dim = 0, 1 y 2.
Ejemplo 3:
En este ejemplo, unimos más de dos tensores. Podemos unir cualquier número de tensores.
Python3
# Python 3 program to demonstrate torch.stack() method # for three one-dimensional tensors # importing torch import torch # creating tensors x = torch.tensor([1., 3., 6., 10.]) y = torch.tensor([2., 7., 9., 13.]) z = torch.tensor([4., 5., 8., 11.]) # printing above created tensors print("Tensor x:", x) print("Tensor y:", y) print("Tensor z:", z) # join above tensor using "torch.stack()" print("join tensors:") t = torch.stack((x, y, z)) # print final tensor after join print(t) print("join tensors dimension 0:") t = torch.stack((x, y, z), dim=0) print(t) print("join tensors dimension 1:") t = torch.stack((x, y, z), dim=1) print(t)
Producción:
Tensor x: tensor([ 1., 3., 6., 10.]) Tensor y: tensor([ 2., 7., 9., 13.]) Tensor z: tensor([ 4., 5., 8., 11.]) join tensors: tensor([[ 1., 3., 6., 10.], [ 2., 7., 9., 13.], [ 4., 5., 8., 11.]]) join tensors dimension 0: tensor([[ 1., 3., 6., 10.], [ 2., 7., 9., 13.], [ 4., 5., 8., 11.]]) join tensors dimension 1: tensor([[ 1., 2., 4.], [ 3., 7., 5.], [ 6., 9., 8.], [10., 13., 11.]])
Ejemplo 4: Demostración de errores
En el siguiente ejemplo, mostramos errores cuando los tensores de entrada no tienen la misma forma.
Python3
# Python 3 program to demonstrate torch.stack() method # for one-dimensional tensors # importing torch import torch # creating tensors x = torch.tensor([1., 3., 6., 10.]) y = torch.tensor([2., 7., 9.]) # printing above created tensors print("Tensor x:", x) print("Tensor y:", y) # join above tensor using "torch.stack()" print("join tensors:") t = torch.stack((x, y)) # print final tensor after join print(t) print("join tensors dimension 0:") t = torch.stack((x, y), dim=0) print(t) print("join tensors dimension 1:") t = torch.stack((x, y), dim=1) print(t)
Producción:
Forma de x: antorcha. Tamaño ([4])
Forma de y: antorcha.Tamaño([3])
RuntimeError: la pila espera que cada tensor tenga el mismo tamaño, pero obtuvo [4] en la entrada 0 y [3] en la entrada 1
Observe que la forma de los dos tensores no es la misma. Lanza un error de tiempo de ejecución. De la misma manera, cuando la dimensión de los tensores no es la misma arroja un error de tiempo de ejecución. Pruebe usted mismo para tensores con diferentes dimensiones y vea cómo es la salida.
Publicación traducida automáticamente
Artículo escrito por shahidedu7 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA