Предположим, у меня есть вложенный тензор 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.