Падвядзенне вынікаў па Эйнштэйну

Тэнзарныя аперацыі ў Python
метады сумавання Эйнштэйна
прыклады Numpy і Tensor Flow
Падвядзенне вынікаў па Эйнштэйну 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.

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

У прыведзеным вышэй прыкладзе 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_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" уяўляе сабой памер партыі.

Перавагі натацыі Эйнсума

1. Лаканічнасць: Абазначэнне Einsum кампактнае і можа сцісла прадстаўляць складаныя аперацыі

2. Гнуткасць: Ён можа апрацоўваць шырокі спектр тэнзарных аперацый без відавочнай змены формы або перастаноўкі масіваў

3. Эфектыўнасць: Многія бібліятэкі аптымізуюць унутраныя аперацыі einsum, што можа прывесці да лепшай прадукцыйнасці.


Career Services background pattern

Кар'ерныя паслугі

Contact Section background image

Давайце заставацца на сувязі

Code Labs Academy © 2025 Усе правы абароненыя.