Comprensión esencial de einsum

einsum es una función de operación matricial rápida y flexible en numpy y pytorch. Leí muchos artículos en Internet para explicar esta operación, pero no expliqué su esencia. Muchas situaciones no se pueden memorizar. Finalmente vi una esencia hoy Explíquelo y regístrelo para usarlo más adelante. Dirección original (no parece ser original):
https://www.jianshu.com/p/27350d110caf
es esencialmente la siguiente imagen, y el operador einsum es la abreviatura de los parámetros clave del siguiente bucle anidado:
inserte la descripción de la imagen aquí
específico explicación:
(1) El '->' del operador einsum es la entrada a la izquierda y la salida a la derecha. La entrada puede ser de 1 a N, cada variable de entrada está separada por ',' y la salida solo puede ser una. La letra de cada variable indica la dimensión correspondiente. El número de letras debe ser coherente con el número de dimensiones; de lo contrario, se informará un error.
(2) Primero, determine el anidamiento del bucle for más externo de acuerdo con la dimensión de salida. Por ejemplo, la salida C anterior tiene dos dimensiones i, j, que son dos capas de anidamiento de bucle.
(3) Luego, la letra de la marca de dimensión que desaparece en el lado de salida indica que se ha producido una agregación adicional, por lo que es necesario realizar un bucle en la capa interna.
(4) La capa inferior del bucle es la multiplicación de los elementos correspondientes de las variables de entrada correspondientes, como el anterior A [i, k] * B [k, j] (5) Lo que se debe agregar es cuando ' -> ' se
omite Indica: Al generar la matriz, elimine las letras repetidas de acuerdo con todas las letras ingresadas y ordénelas en orden alfabético. Por ejemplo, 'ik,kj' significa 'ik,kj -> ij'. Se puede ver que este operador realmente comprime los caracteres al extremo, y si se puede guardar, se puede guardar, otros, no creo que sea necesario aumentar la dificultad de comprensión para poder guardar estos pocos caracteres. .

La explicación anterior puede ayudarnos a comprender cualquier operador einsum, pero en aplicaciones específicas, necesitamos dominar la construcción de operadores que cumplan con los requisitos. Creo que se puede construir en los siguientes pasos: (1) Primero escriba la dimensión de la salida variable a la derecha de '->
',
(2) Luego observe qué dimensiones de las variables de entrada han experimentado agregación aditiva, y el eje donde ocurre la agregación aditiva debe estar representado por una letra que la salida no tiene (3)
Luego observe qué ejes de dimensión entre las variables de entrada deben sincronizarse, generalmente con el mismo eje de significado físico, están representados por la misma letra, (4
) Verifique nuevamente por fin.

Supongo que te gusta

Origin blog.csdn.net/Brikie/article/details/125661022
Recomendado
Clasificación