2017-02-11 2 views
1

저는 backpropagation의 일부로 파이썬에서 신경망을 구현하고 있습니다. 3D 행렬을 곱해야합니다. 차원 코드 (200, 100, 1)을 2D 행렬로 호출하고 치수는 (100, 200)입니다. 결과의 크기는 (200, 200, 1)이어야합니다.numpy 배열의 다차원 행렬 곱셈

A는 오류 벡터이고, W는 가중치 행렬이며, 제품은 이전 계층에 대한 업데이트를 계산하는 데 사용됩니다.

은 난 후 (100,200,1)와 승산 w을 재편 시도 matrix_multiply ( from numpy.core.umath_tests)을 사용하여 해결하려고하지만

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

사소한 치수를 삭제하고 모양 (200, 100)을 만드는 대신 'A'의 모양을 (200, 100, 1)으로 유지해야 할 강력한 이유가 있습니까? –

+0

@WarrenWeckesser 그 옵션을 고려하지 않았습니다. 제안을 주셔서 감사 드리며, 저는 그것을 탐구 할 것입니다. – dpk

답변

3

당신은 swapaxesnp.tensordot 후 변경하다 축을 사용할 수 있습니다하거나 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) 

, 우리는 A의 마지막 축을 따라 유일한 조각을 사용하여 np.dot를 사용하고 행렬 곱셈 후 3D로 확장 -

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

아니면 사용할 수 있습니다 np.einsum -

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