Тензор (Tensor)

Тензор – это многомерный ряд. Это массив чисел, расположенных на сетке с переменным числом осей.
t111, t121, t131 t112, t122, t132 t113, t123, t133
T = (t211, t221, t231), (t212, t222, t232), (t213, t223, t233)
t311, t321, t331 t312, t322, t332 t313, t323, t333
Тензор – это список из списков. Для начала импортируем необходимые библиотеки:
import numpy as np
from numpy import tensordot
from numpy import array
В приведенном ниже примере тензор 3 x 3 x 3 инициализируется как массив библиотеки NumPy. Мы сначала определяем строки, затем список строк, и затем список списков строк.
T = array([
[[1,2,3], [4,5,6], [7,8,9]],
[[11,12,13], [14,15,16], [17,18,19]],
[[21,22,23], [24,25,26], [27,28,29]],
])
Как и в случае с матрицами, мы можем выполнять поэлементные арифметические операции с тензорами.
Сложение
A = array([
[[1,2,3], [4,5,6], [7,8,9]],
[[11,12,13], [14,15,16], [17,18,19]],
[[21,22,23], [24,25,26], [27,28,29]],
])
B = array([
[[1,2,3], [4,5,6], [7,8,9]],
[[11,12,13], [14,15,16], [17,18,19]],
[[21,22,23], [24,25,26], [27,28,29]],
])
C = A + B
print(C)
Сложение сгенерирует такой тензор C:
[[[ 2 4 6]
[ 8 10 12]
[14 16 18]]
[[22 24 26]
[28 30 32]
[34 36 38]]
[[42 44 46]
[48 50 52]
[54 56 58]]]
Вычитание
A = array([
[[1,2,3], [4,5,6], [7,8,9]],
[[11,12,13], [14,15,16], [17,18,19]],
[[21,22,23], [24,25,26], [27,28,29]],
])
B = array([
[[1,2,3], [4,5,6], [7,8,9]],
[[11,12,13], [14,15,16], [17,18,19]],
[[21,22,23], [24,25,26], [27,28,29]],
])
D = A - B
print(D)
Вычитание – такой тензор D:
[[[0 0 0]
[0 0 0]
[0 0 0]]
[[0 0 0]
[0 0 0]
[0 0 0]]
[[0 0 0]
[0 0 0]
[0 0 0]]]
Произведение
Поэлементное умножение одного тензора на другой такой же размерности приводит к созданию нового тензору такой же размерности. Такой частный случай перемножения с одноразмерными матрицами / тензорами называют произведением Адамара.
A = array([
[[1,2,3], [4,5,6], [7,8,9]],
[[11,12,13], [14,15,16], [17,18,19]],
[[21,22,23], [24,25,26], [27,28,29]],
])
B = array([
[[1,2,3], [4,5,6], [7,8,9]],
[[11,12,13], [14,15,16], [17,18,19]],
[[21,22,23], [24,25,26], [27,28,29]],
])
E = A * B
print(E)
Такой код сгенерирует тензор E, который выглядит следующим образом:
[[[ 1 4 9]
[ 16 25 36]
[ 49 64 81]]
[[121 144 169]
[196 225 256]
[289 324 361]]
[[441 484 529]
[576 625 676]
[729 784 841]]]
Если же дан тензор A с q измерений и тензор B с r измерений, их произведение будет новым тензором с q + r размерностями. Например:
A = array([1, 2, 3])
B = array([3, 4])
F = tensordot(A, B, axes=0)
print(F)
Результатом будет такой тензор F:
[[ 3 4]
[ 6 8]
[ 9 12]]
Деление
A = array([
[[1,2,3], [4,5,6], [7,8,9]],
[[11,12,13], [14,15,16], [17,18,19]],
[[21,22,23], [24,25,26], [27,28,29]],
])
B = array([
[[1,2,3], [4,5,6], [7,8,9]],
[[11,12,13], [14,15,16], [17,18,19]],
[[21,22,23], [24,25,26], [27,28,29]],
])
G = A / B
print(G)
Такое поэлементное деление одноразмерных тензоров сгенерирует F:
[[[ 1. 1. 1.]
[ 1. 1. 1.]
[ 1. 1. 1.]]
[[ 1. 1. 1.]
[ 1. 1. 1.]
[ 1. 1. 1.]]
[[ 1. 1. 1.]
[ 1. 1. 1.]
[ 1. 1. 1.]]]
Ноутбук, не требующий дополнительной настройки на момент написания статьи, можно скачать здесь.
Фото: @salty_sandals