2 min read

Тензор (Tensor)

Тензор (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