PyTorch: как использовать torch.einsum () для поиска следа между скалярным произведением вложенного тензора и другого тензора - PullRequest
2 голосов
/ 02 августа 2020

Предположим, у меня есть вложенный тензор A:

import torch.nn as nn
X = np.array([[1, 3, 2], [2, 3, 5], [1, 2, 3]])
X = torch.DoubleTensor(X)

rows = X.shape[0]
cols = X.shape[1]

A = torch.matmul(X.view(rows, cols, 1),
                 X.view(rows, 1, cols))

A

Вывод:

tensor([[[ 1.,  3.,  2.],
         [ 3.,  9.,  6.],
         [ 2.,  6.,  4.]],

        [[ 4.,  6., 10.],
         [ 6.,  9., 15.],
         [10., 15., 25.]],

        [[ 1.,  2.,  3.],
         [ 2.,  4.,  6.],
         [ 3.,  6.,  9.]]], dtype=torch.float64)

И у меня есть другой тензор B:

B = torch.DoubleTensor([[11., 21, 31], [31, 51, 31], [41, 51, 21]])
B

Вывод:

tensor([[11., 21., 31.],
        [31., 51., 31.],
        [41., 51., 21.]])

Как использовать torch.einsum(), чтобы найти значение следа между скалярным произведением каждого из вложенных тензоров в A и тензора B. Например, значение следа скалярного произведения между 1-м вложенным тензором в A:

[[ 1.,  3.,  2.],
 [ 3.,  9.,  6.],
 [ 2.,  6.,  4.]]

и B:

tensor([[11., 21., 31.],
        [31., 51., 31.],
        [41., 51., 21.]])

и аналогично с двумя другими вложенными тензорами в A.

Мой тензор результатов будет тензором всего с 3 значениями трассировки. Есть ли способ сделать это, не перебирая каждый вложенный тензор в A (например, a для l oop)?

Ps:

Я знаю код, чтобы найти след значение между скалярным произведением 2 тензоров составляет:

torch.einsum('ij,ji->', X, Y).item()

Если вы знаете, как это сделать с помощью numpy.einsum(), сообщите мне тоже. Возможно, мне просто нужно немного подправить numpy.einsum(), чтобы он работал с тензорами PyTorch.

1 Ответ

1 голос
/ 02 августа 2020

Это довольно просто, вам нужно добавить «размер партии» A:

torch.einsum('bij,ji->b', A, B)

Результат будет

tensor([1346., 3290., 1216.])
...