Умножающие тензоры, содержащие изображения в 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 и выше.

Другие вопросы по тегам