Умножающие тензоры, содержащие изображения в numy
У меня есть следующие тензоры 3-го порядка. Оба тензора являются матрицами: первый тензор содержит 100 матриц 10х9, а второй - 100 матриц 3х10 (которые я только что заполнил единицами для этого примера).
Моя цель состоит в том, чтобы умножить матрицы как однозначное соответствие, чтобы получить тензор с формой: (100, 3, 9)
Это можно сделать с помощью цикла for, который просто сжимает оба тензора, а затем берет точку каждого, но я собираюсь сделать это только с помощью операторов numpy. Пока вот несколько неудачных попыток
Попытка 1:
import numpy as np
T1 = np.ones((100, 10, 9))
T2 = np.ones((100, 3, 10))
print T2.dot(T1).shape
Результат попытки 1:
(100, 3, 100, 9)
Что означает, что он перепробовал все возможные комбинации... что не то, что мне нужно.
На самом деле ни одна из других попыток даже не компилируется. Я пытался использовать np.tensordot, np.einsum (читайте здесь https://jameshensman.wordpress.com/2010/06/14/multiple-matrix-multiplication-in-numpy что он должен делать эту работу, но я этого не сделал получить правильные индексы Эйнштейна) также в той же ссылке есть какой-то сумасшедший метод изменения формы тензорного куба, который мне не удалось визуализировать. Любые предложения / идеи-объяснения о том, как справиться с этим?
1 ответ
Ты пробовал?
In [96]: np.einsum('ijk,ilj->ilk',T1,T2).shape
Out[96]: (100, 3, 9)
То, как я это понимаю, это посмотреть на формы:
(100, 10, 9)) (i, j, k)
(100, 3, 10) (i, l, j)
-------------
(100, 3, 9) (i, l, k)
два j
суммировать и отменить. Остальные несут к выходу.
Для 4d массивов, с размерами как (100,3,2,24 )
Есть несколько вариантов:
Изменить форму в 3d, T1.reshape(300,2,24)
и после изменения формы обратно R.reshape(100,3,...)
, Изменить форму практически бесплатно, и хороший numpy
инструмент.
Добавить индекс в einsum
: np.einsum('hijk,hilj->hilk',T1,T2)
просто параллельное использование того из i
,
Или используйте elipsis: np.einsum('...jk,...lj->...lk',T1,T2)
, Это выражение работает с 3d, 4d и выше.