У меня есть два тензора форм (8, 1, 128) следующим образом.
q_s.shape
Out[161]: torch.Size([8, 1, 128])
p_s.shape
Out[162]: torch.Size([8, 1, 128])
Выше два тензора представляют пакет из восьми 128-мерных векторов. Мне нужен скалярный продукт партии q_s
с партией p_s
. Как я могу это сделать? Я пробовал использовать функцию torch.tensordot
следующим образом. Он также работает, как ожидалось. Но он также выполняет дополнительную работу, которой я не хочу. См. Следующий пример.
dt = torch.tensordot(q_s, p_s, dims=([1,2], [1,2]))
dt
Out[176]:
tensor([[0.9051, 0.9156, 0.7834, 0.8726, 0.8581, 0.7858, 0.7881, 0.8063],
[1.0235, 1.5533, 1.2155, 1.2048, 1.3963, 1.1310, 1.1724, 1.0639],
[0.8762, 1.3490, 1.2923, 1.0926, 1.4703, 0.9566, 0.9658, 0.8558],
[0.8136, 1.0611, 0.9131, 1.1636, 1.0969, 0.9443, 0.9587, 0.8521],
[0.6104, 0.9369, 0.9576, 0.8773, 1.3042, 0.7900, 0.8378, 0.6136],
[0.8623, 0.9678, 0.8163, 0.9727, 1.1161, 1.6464, 0.9765, 0.7441],
[0.6911, 0.8392, 0.6931, 0.7325, 0.8239, 0.7757, 1.0456, 0.6657],
[0.8493, 0.8174, 0.8041, 0.9013, 0.8003, 0.7451, 0.7408, 1.1771]],
grad_fn=<AsStridedBackward>)
dt.shape
Out[177]: torch.Size([8, 8])
Как мы видим, это дает тензор размера (8,8) с скалярными произведениями, которые я хочу расположить по диагонали. Есть ли другой способ получить меньший требуемый тензор формы (8,1), который просто содержит элементы, лежащие на диагонали в приведенном выше результате. Чтобы быть более ясным, элементы, лежащие по диагонали, являются правильными требуемыми скалярными произведениями, которые мы хотим получить как скалярное произведение двух партий. Элемент с индексом [0] [0] является скалярным произведением q_s [0] и p_s [0]. Элемент с индексом [1] [1] является скалярным произведением q_s [1] и p_s [1] и т. Д.
Есть ли лучший способ получить желаемое скалярное произведение в pytorch?