Az Einstein-összegzés

Tenzorműveletek Pythonban
Einstein-összegzési technikák
Numpy és Tensor Flow példák
Az Einstein-összegzés cover image

Az Einstein-összegzés egy tömör és hatékony módja a tenzorműveletek ábrázolásának, amelyet gyakran használnak a fizikában és a gépi tanulásban. Lehetővé teszi, hogy összetett számításokat írjunk a tenzorokra kompakt formában. Bemutatjuk az Einstein-összegzés alapjait, hogyan kell használni Pythonban a Numpy-val és a Tensorflow-val, és példákkal illusztráljuk a használatát.

Az Einstein-összegzés alapjai

Az Einstein-összegzési jelölés (Einsum) a tenzorkifejezésekben ismétlődő indexek összegzésének gondolatán alapul. A következő két szabályon alapul:

1. Ismétlődő indexek összegzése: Ha egy index kétszer szerepel egy kifejezésben, akkor összegzésre kerül

2. Szabad indexek: A csak egyszer megjelenő indexek szabad indexek, és a kimeneti tenzor tengelyeit jelentik

Illusztráljuk ezt két A és B mátrix szorzásának példájával: a kapott C mátrixot a következőképpen definiáljuk:

Cik=jAijBjkC_{ik} = \sum\limits_{j}^{}A_{ij}B_{jk}

A Pythonban a Numpy és a Tensorflow könyvtárak is biztosítanak einsum függvényt.

Dögös

import numpy as np

# Define two matrices A and B
A = np.array([[1, 2], [3, 4]])
B = np.array([[5, 6], [7, 8]])

# Perform matrix multiplication using einsum
C = np.einsum('ij,jk->ik', A, B)

print(C)
# [[19 22]
#  [43 50]]

A fenti példában az "ij,jk->ik" az einsum karakterlánc:

Az "ij" az A mátrix indexeit jelenti

A "jk" a B mátrix indexeit jelenti

A ->ik a C kimeneti mátrix indexeit adja meg

A művelet összegzi a j indexet

Ugyanez a kód a Tensorflow-ban nézne ki

import tensorflow as tf

# Define two matrices A and B
A = tf.constant([[1, 2], [3, 4]], dtype=tf.float32)
B = tf.constant([[5, 6], [7, 8]], dtype=tf.float32)

# Perform matrix multiplication using einsum
C = tf.einsum('ij,jk->ik', A, B)

print(C)
# tf.Tensor(
# [[19. 22.]
#  [43. 50.]], shape=(2, 2), dtype=float32)

További példák

A vektorok belső terméke

Két a és b vektor belső szorzatát (pontszorzatát) a következőképpen definiáljuk

c=iaibic = \sum\limits_{i}^{}a_{i}b_{i}

a = np.array([1, 2, 3])
b = np.array([4, 5, 6])

c = np.einsum('i,i->', a, b)

print(c)  # Output: 32

A vektorok külső terméke

Két a és b vektor külső szorzata a következőképpen adódik:

Cij=aibjC_{ij} = a_{i}b_{j}

C = np.einsum('i,j->ij', a, b)

print(C)
# Output
# [[4 5 6]
#  [8 10 12]
#  [12 15 18]]

Mátrix transzponálása

Az A mátrix transzponálása az indexeinek felcserélésével érhető el

A_transpose = np.einsum('ij->ji', A)

print(A_transpose)
# Output
# [[1. 3.]
#  [2. 4.]]

Mátrix nyoma

Az A mátrix nyomvonala az átlós elemeinek összege:

Tr(A)=iAiiAiiTr(A) = \sum\limits_{i}^{}A_{ii}A_{ii}


trace = np.einsum('ii->', A)

print(trace)
# Output: 5.0

Kötegelt mátrixszorzás

Az Einsum különösen hasznos kötegelt műveleteknél. Tegyük fel, hogy van egy köteg A és B mátrixunkból, és meg akarjuk szorozni a kötegben lévő megfelelő mátrixokat:


A = np.random.rand(3, 2, 2)
B = np.random.rand(3, 2, 2)

# Perform batch matrix multiplication
C = np.einsum('bij,bjk->bik', A, B)

print(C)

Itt a "b" a köteg dimenzióját jelenti.

Az Einsum jelölés előnyei

1. Tömörség: Az Einsum jelölés kompakt, és tömören ábrázolhatja az összetett műveleteket

2. Rugalmasság: A tenzorműveletek széles skáláját képes kezelni a tömbök kifejezett átformálása vagy transzponálása nélkül

3. Hatékonyság: Sok könyvtár belsőleg optimalizálja az einsum műveleteket, ami jobb teljesítményt eredményezhet.


Career Services background pattern

Karrier szolgáltatások

Contact Section background image

Maradjunk kapcsolatban

Code Labs Academy © 2025 Minden jog fenntartva.