2017-02-11 18 views
1

私は、バックプロパゲーションの一部として、ニューロンネットワークをPythonで実装しています。3D行列を乗算する必要があります。次元は(200, 100, 1)、次元はW、次元はです。結果のサイズは(200, 200, 1)である必要があります。numpy配列の多次元行列乗算

Aは誤差ベクトル、Wは重み行列です。この積は前のレイヤの更新を計算するために使用されます。

Iはmatrix_multiplyfrom numpy.core.umath_tests)を使用して、それを解決しようとした、私は(100,200,1)にWを再形成し、その後乗算試み、それは

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)