Էյնշտեյնի գումարումը

Տենզորային գործողություններ Python-ում
Էյնշտեյնի գումարման տեխնիկան
անսարք և տենզորի հոսքի օրինակներ
Էյնշտեյնի գումարումը cover image

Էյնշտեյնի գումարման նշումը տենզորի գործողությունները ներկայացնելու հակիրճ և հզոր միջոց է, որը հաճախ օգտագործվում է ֆիզիկայում և մեքենայական ուսուցման մեջ: Այն թույլ է տալիս մեզ բարդ հաշվարկներ գրել թենզորների վրա կոմպակտ ձևով: Մենք կանդրադառնանք Էյնշտեյնի գումարման հիմունքներին, ինչպես օգտագործել այն Python-ում Numpy-ի և Tensorflow-ի հետ, և օրինակներ կներկայացնենք դրա օգտագործումը լուսաբանելու համար:

Էյնշտեյնի գումարման հիմունքները

Էյնշտեյնի գումարման նշումը (Einsum) հիմնված է տենզորային արտահայտություններում կրկնվող ինդեքսների գումարման գաղափարի վրա։ Այն հիմնված է հետևյալ երկու կանոնների վրա.

**1. Կրկնվող ինդեքսների գումարումը.

2. Ազատ ինդեքսներ. Ցուցանիշները, որոնք հայտնվում են միայն մեկ անգամ, ազատ ինդեքսներ են և ներկայացնում են ելքային թենզորի առանցքները

Եկեք դա ցույց տանք A և B երկու մատրիցների բազմապատկման օրինակով. ստացված C մատրիցը սահմանվում է որպես.

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

Python-ում և՛ Numpy, և՛ Tensorflow գրադարաններն ապահովում են einsum ֆունկցիա:

Թմրած

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

Վերևի օրինակում «ij,jk->ik»-ը einsum տողն է.

«ij»-ը ներկայացնում է A մատրիցի ինդեքսները

«jk»-ը ներկայացնում է B մատրիցի ինդեքսները

«->ik»-ը սահմանում է C ելքային մատրիցի ինդեքսները

Գործողությունը գումարվում է j ցուցանիշի վրա

Նույն կոդը 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)

Լրացուցիչ օրինակներ

Վեկտորների ներքին արդյունք

Երկու a և b վեկտորների ներքին արտադրյալը (կետային արտադրյալը) սահմանվում է որպես

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 և b վեկտորների արտաքին արտադրյալը տրվում է հետևյալով.

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

Մատրիցայի փոխադրում

A մատրիցի տրանսպոզիցիան կարելի է ստանալ՝ փոխանակելով դրա ինդեքսները

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

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

Մատրիցայի հետք

A մատրիցի հետքը նրա անկյունագծային տարրերի գումարն է.

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


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

print(trace)
# Output: 5.0

Խմբաքանակի մատրիցայի բազմապատկում

Einsum-ը հատկապես օգտակար է խմբաքանակային գործառնությունների համար: Ենթադրենք, որ մենք ունենք A և B մատրիցների խմբաքանակ, և մենք ցանկանում ենք բազմապատկել համապատասխան մատրիցները խմբաքանակում.


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)

Այստեղ «b»-ը ներկայացնում է խմբաքանակի չափը:

Einsum Նշման առավելությունները

1. Հակիրճություն. Einsum նշումը կոմպակտ է և կարող է համառոտ ներկայացնել բարդ գործողություններ

2. Ճկունություն. Այն կարող է կառավարել տենզորի գործողությունների լայն տեսականի՝ առանց զանգվածների հստակ ձևափոխման կամ փոխադրման

3. Արդյունավետություն. Շատ գրադարաններ օպտիմիզացնում են einsum գործառնությունները ներսից՝ պոտենցիալ հանգեցնելով ավելի լավ կատարողականության:


Career Services background pattern

Կարիերայի ծառայություններ

Contact Section background image

Եկեք մնանք կապի մեջ

Code Labs Academy © 2025 Բոլոր իրավունքները պաշտպանված են.