Einsteins sammanfattning

Tensoroperationer i Python
Einstein Summation Techniques
Numpy och Tensor Flow Exempel
Einsteins sammanfattning cover image

Einstein Summation-notationen är ett kortfattat och kraftfullt sätt att representera tensoroperationer, som ofta används inom fysik och maskininlärning. Det låter oss skriva komplexa beräkningar på tensorer i en kompakt form. Vi kommer att täcka grunderna om Einstein-summering, hur man använder den i Python med Numpy och Tensorflow, och ger exempel för att illustrera användningen.

Grunderna i Einstein Summation

Einstein Summation-notationen (Einsum) är baserad på idén att summera över upprepade index i tensoruttryck. Den bygger på följande två regler:

1. Summering över upprepade index: Om ett index förekommer två gånger i en term, summeras det över

2. Fria index: Index som endast visas en gång är fria index och representerar axlarna för den utgående tensorn

Låt oss illustrera detta med exemplet att multiplicera två matriser A och B: den resulterande matrisen C definieras som

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

I Python tillhandahåller både Numpy- och Tensorflow-biblioteken en einsum-funktion.

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

I exemplet ovan är ij,jk->ik einsum-strängen:

ij representerar indexen för matris A

"jk" representerar indexen för matris B

->ik specificerar indexen för utmatrisen C

Operationen summerar över index j

Samma kod i Tensorflow skulle se ut

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)

Fler exempel

Inre produkt av vektorer

Den inre produkten (punktprodukten) av två vektorer a och b definieras som

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

Yttre produkt av vektorer

Den yttre produkten av två vektorer a och b ges av:

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

Transponera en matris

Transponeringen av en matris A kan erhållas genom att byta dess index

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

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

Spår av en matris

Spåret för en matris A är summan av dess diagonala element:

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


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

print(trace)
# Output: 5.0

Satsmatrismultiplikation

Einsum är särskilt användbart för batchoperationer. Antag att vi har en sats av matriserna A och B, och vi vill multiplicera motsvarande matriser i partiet:


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)

Här representerar "b" batchdimensionen.

Fördelar med Einsum Notation

1. Kortfattad: Einsum-notationen är kompakt och kan representera komplexa operationer kortfattat

2. Flexibilitet: Den kan hantera en mängd olika tensoroperationer utan att explicit omforma eller transponera arrayer

3. Effektivitet: Många bibliotek optimerar einsum-driften internt, vilket kan leda till bättre prestanda.


Career Services background pattern

Karriärtjänster

Contact Section background image

Låt oss hålla kontakten

Code Labs Academy © 2025 Alla rättigheter förbehållna.