[Aprendizaje profundo] Temas de transmisión de tensor

1. Descripción

        La transmisión de tensores es una tecnología que convierte automáticamente tensores de baja dimensión en tensores de alta dimensión, lo que permite realizar operaciones basadas en elementos (como suma, resta, multiplicación, etc.) entre tensores. Durante la transmisión de tensores, los tensores con menos dimensiones se copian a lo largo del eje de longitud 1. Después de hacer coincidir las dimensiones, se pueden operar dos tensores.

2. El concepto básico de tensor

        La transmisión ocurre cuando un tensor más pequeño se "estira" para que tenga una forma compatible con el tensor más grande para realizar una operación.

 

La transmisión puede ser una forma eficiente de realizar operaciones de tensor sin crear datos duplicados.

Según PyTorch, los tensores son "transmisibles" cuando:

Todo tensor tiene al menos una dimensión.

Al recorrer los tamaños de dimensión, comenzando desde la dimensión final, los tamaños de dimensión deben ser iguales, uno de ellos es 1 o uno de ellos no existe

Al comparar formas, la dimensión posterior es el número más a la derecha.

En la imagen de arriba, se puede ver el proceso general:

1. Determinar si las dimensiones más a la derecha son compatibles

  • ¿Todo tensor tiene al menos una dimensión?
  • ¿Son iguales en tamaño? ¿uno de ellos? uno no existe?

2. Estire las dimensiones al tamaño apropiado

3. Repita los pasos anteriores para la siguiente dimensión

Estos pasos se pueden ver en el siguiente ejemplo.

3. Operaciones a nivel de elemento

        Todas las operaciones con elementos requieren que los tensores tengan la misma forma.

3.1 Ejemplos vectoriales y escalares

import torch
a = torch.tensor([1, 2, 3])
b = 2 # becomes ([2, 2, 2])

a * b
tensor([2, 4, 6])

        En este ejemplo, la forma del escalar es (1,) y la forma del vector es (3,). Como se muestra, b se transmite a la forma (3,) y el producto de Hadamard funciona como se esperaba.

3.2 Matriz y vector ejemplo 1

 

        En este ejemplo, A  tiene forma (3, 3) yb tiene  forma (3,).

Cuando ocurre la multiplicación, los vectores se estiran fila por fila para crear una matriz, como se muestra en la imagen de arriba. Ahora, tanto A  como  b  tienen forma (3, 3).

        Esto se puede ver a continuación.


A = torch.tensor([[1, 2, 3],
                  [4, 5, 6],
                  [7, 8, 9]])

b = torch.tensor([1, 2, 3])

A * b
tensor([[ 1,  4,  9],
        [ 4, 10, 18],
        [ 7, 16, 27]])

3.3 Matriz y vector ejemplo 2

 

        En este ejemplo, tiene forma (3, 3) yb tiene  forma (3, 1).

        Cuando ocurre la multiplicación, el vector se estira columna por columna para crear dos columnas adicionales, como se muestra en la imagen de arriba. Ahora, tanto A  como  b  tienen forma (3, 3).

A = torch.tensor([[1, 2, 3],
                  [4, 5, 6],
                  [7, 8, 9]])

b = torch.tensor([[1], 
                  [2], 
                  [3]])
A * b
tensor([[ 1,  2,  3],
        [ 8, 10, 12],
        [21, 24, 27]])

Ejemplo de tensor y vector

         En este ejemplo, es un tensor de forma (2, 3, 3) yb es  un vector columna de forma (3, 1).

A = (2, 3, 3)
b = ( , 3, 1)

        Comenzando con la dimensión más a la derecha, cada elemento se estira en forma de columna para producir una matriz (3, 3). Las dimensiones del medio son iguales. En este punto, b es solo una matriz. La dimensión más a la izquierda no existe, por lo que se debe agregar una. Luego, la matriz debe transmitirse para crear un tamaño de (2, 3, 3). Ahora hay dos (3, 3) matrices, que se pueden ver en la figura de arriba.

        Esto permite calcular los productos de Hadamard y generar matrices (2, 3, 3):

A = torch.tensor([[[1, 2, 3],
                   [4, 5, 6],
                   [7, 8, 9]],

                  [[1, 2, 3],
                   [4, 5, 6],
                   [7, 8, 9]]])

b = torch.tensor([[1], 
                  [2], 
                  [3]])

A * b
tensor([[[ 1,  2,  3],
         [ 8, 10, 12],
         [21, 24, 27]],

        [[ 1,  2,  3],
         [ 8, 10, 12],
         [21, 24, 27]]])

3.4 Ejemplos de tensores y matrices

        En este ejemplo, es un tensor de forma (2, 3, 3) y es una matriz de forma (3, 3).

A = (2, 3, 3)
B = ( , 3, 3)

        Este ejemplo es más fácil que el anterior porque las dos dimensiones más a la derecha son iguales. Esto significa que la matriz simplemente necesita transmitirse en la dimensión más a la izquierda para crear una forma de (2, 3, 3). Simplemente significa que se requiere una matriz adicional.

        Al calcular el producto de Hadamard, el resultado es (2, 3, 3).

A = torch.tensor([[[1, 2, 3],
                   [4, 5, 6],
                   [7, 8, 9]],
                   
                  [[1, 2, 3],
                   [4, 5, 6],
                   [7, 8, 9]]])

B = torch.tensor([[1, 2, 3], 
                  [1, 2, 3], 
                  [1, 2, 3]])

A * B
tensor([[[ 1,  4,  9],
         [ 4, 10, 18],
         [ 7, 16, 27]],

        [[ 1,  4,  9],
         [ 4, 10, 18],
         [ 7, 16, 27]]])

4. Multiplicación de matrices y tensores y producto escalar

        Para todos los ejemplos anteriores, el objetivo es terminar con la misma forma para permitir la multiplicación por elementos. El objetivo de este ejemplo es implementar la multiplicación de matrices y tensores a través del producto escalar, lo que requiere que la última dimensión de la primera matriz o tensor coincida con la penúltima dimensión de la segunda matriz o tensor.

        Para la multiplicación de matrices:

  • (m, n) x (n, r) = (c, m, r)

        Para la multiplicación de tensores 3D:

  • (c, m, n) x (c, n, r) = (c, m, r)

Para la multiplicación de tensores 4D:

  • (z, c, m, n) x (z, c, n, r) = (z, c, m, r)

ejemplo

        Para este ejemplo, A tiene forma (2, 3, 3) y tiene forma (3, 2). A partir de ahora, las dos últimas dimensiones califican para la multiplicación de productos escalares. Se debe agregar una dimensión a  B y se debe transmitir una matriz (3, 2) a través de esta dimensión para crear una forma de (2, 3, 2).

        El resultado de esta multiplicación tensorial será (2, 3, 3) x (2, 3, 2 ) = (2, 3, 2).

A = torch.tensor([[[1, 2, 3],
                   [4, 5, 6],
                   [7, 8, 9]],
                   
                  [[1, 2, 3],
                   [4, 5, 6],
                   [7, 8, 9]]])

B = torch.tensor([[1, 2], 
                  [1, 2], 
                  [1, 2]])

A @ B # A.matmul(B)
tensor([[[ 6, 12],
         [15, 30],
         [24, 48]],

        [[ 6, 12],
         [15, 30],
         [24, 48]]])

        Puede encontrar información adicional sobre la transmisión en el siguiente enlace. Puede encontrar más información sobre los tensores y sus operaciones aquí .

Supongo que te gusta

Origin blog.csdn.net/gongdiwudu/article/details/131758414
Recomendado
Clasificación