2017-02-11 20 views
1

Я реализую нейронную сеть в python, как часть backpropagation Мне нужно умножить 3D-матрицу, назовите ее A, размерность (200, 100, 1), на двумерную матрицу, назовите ее W, размерность (100, 200) результат должен иметь размеры (200, 200, 1).Многомерное умножение матрицы на массив numpy

A - вектор ошибок, W - весовая матрица, продукт должен использоваться для расчета обновлений для предыдущего слоя.

Я попытался решить ее с помощью matrix_multiply (from numpy.core.umath_tests), я попытался изменения формы W в (100,200,1) и умножения, но это бросает

ValueError: matrix_multiply: Input operand 1 has a mismatch in its core dimension 0, with gufunc signature (m,n),(n,p)->(m,p) (size 100 is different from 1).

Как я могу это решить?

+0

У вас есть веская причина для сохранения формы 'A' как (200, 100, 1) вместо того, чтобы сбросить тривиальное измерение и сделать его форму (200, 100)? –

+0

@WarrenWeckesser Я не рассматривал этот вариант. Спасибо за предложение, я изучу его. – dpk

ответ

3

Вы можете использовать np.tensordot и затем переставить осей с swapaxes или просто reshape -

np.tensordot(A,W,axes=((1),(0))).swapaxes(1,2) 
np.tensordot(A,W,axes=((1),(0))).reshape(A.shape[0],W.shape[1],1) 

В качестве альтернативы можно использовать np.dot используя только срез вдоль последней оси A, а затем после матричного умножения простираться в 3D -

A[:,:,0].dot(W)[...,None] 

Или мы можем использовать np.einsum -

np.einsum('ijk,jl->ilk',A,W)