Einsteinův souhrn

Tenzorové operace v Pythonu
Einsteinovy ​​sčítací techniky
příklady Numpy a Tensor Flow
Einsteinův souhrn cover image

Zápis Einstein Summation je stručný a účinný způsob, jak reprezentovat tenzorové operace, často používaný ve fyzice a strojovém učení. Umožňuje nám psát složité výpočty na tenzorech v kompaktní podobě. Probereme základy Einsteinovy ​​sumace, jak ji používat v Pythonu s Numpy a Tensorflow, a poskytneme příklady pro ilustraci jejího použití.

Základy Einsteinovy ​​sumace

Einsteinův sumační zápis (Einsum) je založen na myšlence sčítání přes opakované indexy v tenzorových výrazech. Je založen na následujících dvou pravidlech:

1. Sumace přes opakované indexy: Pokud se index objeví dvakrát v termínu, je sečten

2. Volné indexy: Indexy, které se objeví pouze jednou, jsou volné indexy a představují osy výstupního tenzoru

Ukažme si to na příkladu násobení dvou matic A a B: výsledná matice C je definována jako

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

V Pythonu poskytují knihovny Numpy i Tensorflow funkci einsum.

Numpy

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]]

Ve výše uvedeném příkladu je ij,jk->ik řetězec einsum:

„ij“ představuje indexy matice A

„jk“ představuje indexy matice B

->ik určuje indexy výstupní matice C

Operace sečte přes index j

Stejný kód by vypadal v Tensorflow

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)

Další příklady

Vnitřní produkt vektorů

Vnitřní součin (tečkový součin) dvou vektorů aab je definován jako

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

Vnější produkt vektorů

Vnější součin dvou vektorů a a b je dán vztahem:

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]]

Transponujte matici

Transpozici matice A lze získat záměnou jejích indexů

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

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

Stopa matice

Stopa matice A je součtem jejích diagonálních prvků:

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


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

print(trace)
# Output: 5.0

Dávkové maticové násobení

Einsum je zvláště užitečný pro dávkové operace. Předpokládejme, že máme dávku matic A a B a chceme vynásobit odpovídající matice v dávce:


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)

Zde b představuje rozměr dávky.

Výhody notace Einsum

1. Stručnost: Zápis Einsum je kompaktní a může stručně reprezentovat složité operace

2. Flexibilita: Dokáže zpracovat širokou škálu tenzorových operací bez explicitního přetváření nebo transponování polí

3. Efektivita: Mnoho knihoven interně optimalizuje operace einsum, což může vést k lepšímu výkonu.


Career Services background pattern

Kariérní služby

Contact Section background image

Zůstaňme v kontaktu

Code Labs Academy © 2025 Všechna práva vyhrazena.