Забавный тензорный продукт Numpy / PyTorch

#python #numpy #pytorch #torch #algebra

#python #numpy #pytorch #факел #алгебра

Вопрос:

У меня есть 4-мерный параметр тензора факела, определенный следующим образом :

 nn.parameter.Parameter(data=torch.Tensor((13,13,13,13)), requires_grad=True)
 

и четыре тензора с уменьшениями (batch_size,13) (или один тензор с уменьшениями (batch_size, 4,13)).
Я хотел бы получить тензор с размерами (batch_size), равными формуле в конце этого рисунка :
[РЕДАКТИРОВАТЬ: я допустил ошибку в первом изображении, я ее исправил]
введите описание изображения здесь
Я видел в документации torch функцию tensordot, но мне не удается заставить ее работать самостоятельно.

Комментарии:

1. Просто чтобы быть уверенным, вы индексируете свой вывод B с i помощью, но он отличается от переменной mute, для которой вы выполняете самую внешнюю сумму, верно?

2. Это result = (A[None, :, :, :, :] * X[:, :, None, None, None] * Y[:, None, :, None, None] * Z[:, None, None, :, None] * T[:, None, None, None, :]).flatten(1).sum(dim=1) то, что вы хотите? Если это так, я могу опубликовать ответ с объяснением.

3. Единственная причина, по которой я в замешательстве и не публикую в качестве ответа, — это использование индекса i в левой и правой частях уравнения, которое вы опубликовали.

4. @trialNerror Я исправил свою картинку, и вы правы, мне пришлось добавить переменную b для пакетных элементов.

5. @jodag я не уверен, что это то, что я пытаюсь сделать, поскольку X, Y, Z и T в вашем уравнении являются тензорами dims 5, а мои — тензорами dims 2.

Ответ №1:

всякий раз, когда у вас есть забавный тензорный продукт torch.einsum (или numpy.einsum ), ваш друг:

 batch_size = 5
A = torch.rand(13, 13, 13, 13)
a = torch.rand(batch_size, 13)
b = torch.rand(batch_size, 13)
c = torch.rand(batch_size, 13)
d = torch.rand(batch_size, 13)
B = torch.einsum('ijkl,bi,bj,bk,bl->b', A, a, b, c, d)
 

Комментарии:

1. Отлично, большое спасибо, не знал об этой функции. Может ли он работать и на gpu?

2. @Jogima_cyber torch.einsum является частью pytorch basic operations. Он не только работает на cpu / gpu, но и распространяет градиенты на входные тензоры.

3. Такие замечательные, такие сложные скрытые вычисления.