Я пытаюсь выполнить умножение матрицы с фронтальными срезами трехмерного тензора, показанного ниже. Если X.shape == (N, N)
и Y.shape == (N, N, Y)
, то полученный тензор должен иметь форму (N, N, Y)
.Тенденционный тензор: Tensordot над лобными срезами тензора
Что такое правильный np.tensordot
синтаксис для этого?
Я пытаюсь ограничить себя np.tensordot
, а не np.einsum
, потому что я хочу позже перевести это решение на Theano. К сожалению, у Theano еще нет np.einsum
.
График адаптированного this paper о тензорном умножении. Не-tensordot ответ эквивалентно следующему
tensor = np.random.rand(3, 3, 2)
X = np.random.rand(3, 3)
output = np.zeros((3, 3, 2))
output[:, :, 0] = X.dot(tensor[:, :, 0])
output[:, :, 1] = X.dot(tensor[:, :, 1])
Это дает мне тот же ответ, что и выше. Спасибо! – hlin117
Последний вопрос, @ Дивакар. Теперь я хочу выполнить вышеуказанное, используя боковые срезы, используя тензор '(n, m, m). ('output [0,:,:] = X.dot (Tensor [0,:,:])' и т. д. Я пробовал 'np.tensor (X, Tensor, axes = ([1], [1 ]) ', но это не дает мне желаемых результатов.Каким должен быть параметр 'axes' в этом случае? – hlin117
@ hlin117 Из-за того, как вы сохраняете вывод, вам необходимо затем транспонировать: 'np.tensordot (X, тензор, оси = ([1], [1])). Транспонировать (1,0,2)' , – Divakar