2016-12-27 19 views
0

私はTheano dvectorに100要素を持っています。私はまた、5列と100行の行列を持っています(つまり、各列に100要素が入っています)。行列の各列にベクトルで要素を掛ける方法Theanoでは?

今、私はベクトルごとに各列の要素ごとの乗算を適用する必要があります。 Theanoでそれを行う正しい方法は何ですか?

私のベクトルを5回繰り返すことで新しい行列を作り、それを転置して、同じ形状の2つの行列を要素ごとに掛けるべきですか?私は、numpyのに必要な動作を実現することを学んだ

を追加して、私はちょうど1列と2次元配列として私のベクトルを宣言する必要があります。言い換えれば、 "行"ベクトルを "列"ベクトルに置き換える必要があります(または、水平方向ではなく垂直方向に値を書き込む必要があります)。この場合numpyは必要に応じてベクトル(列)をブロードキャストします(私の行列の各列には私のベクトル要素を賢く乗算します)。 Theanoはnumpyののこの動作を継承しないようにしかし、それはなります

X = T.dmatrix('X') 

w = np.array([ 
    [10.0, 0.0, 0.0, 0.0, 0.0], 
    [0.0, 10.0, 0.0, 0.0, 0.0], 
    [0.0, 0.0, 10.0, 0.0, 0.0] 
    ], dtype=th.config.floatX) 
w = np.transpose(w) 

W = th.shared(w, name='W', borrow=True) 

R = W + X 

f = th.function([X], R) 

x = np.array([[1.0], [2.0], [3.0], [4.0], [5.0]]) 
print f(x) 

これは私が取得エラーです:私は、次の中xを定義する場合

ValueError: Input dimension mis-match. (input[0].shape[1] = 3, input[1].shape[1] = 1) 
Apply node that caused the error: Elemwise{add,no_inplace}(W, X) 
Toposort index: 0 
Inputs types: [TensorType(float64, matrix), TensorType(float64, matrix)] 
Inputs shapes: [(5, 3), (5, 1)] 
Inputs strides: [(8, 40), (8, 8)] 

ちなみに、コードは動作します方法:

x = np.array([[1.0, 1.0, 1.0], [2.0, 2.0, 2.0], [3.0, 3.0, 3.0], [4.0, 4.0, 4.0], [5.0, 5.0, 5.0]]) 

答えて

0

私が発見した「ネイティブ」ソリューションはtheano.tensor.extra_ops.repeat操作を使用することです。より詳細には、私は使用する必要があります

Xr = T.extra_ops.repeat(X, 3, axis=1) 

この操作は、列ベクトルを3回繰り返します。その結果、3つの列(同じ列)を持つ行列が得られ、この行列はWの行列要素と賢明に乗算(または合計)できます。

関連する問題