2016-12-27 94 views
0

我有一個Theano dvector與100個元素。我也有一個有5列和100行的矩陣(換句話說,每列包含100個元素)。如何將矩陣的每列乘以Theano中的矢量元素?

現在我需要應用每個列的元素乘法的矢量。什麼是在Theano做正確的方法?

我應該創建一個新的矩陣:重複我的向量5次並對其進行移位,然後乘以相同形狀的兩個矩陣元素?

ADDED

我已經瞭解到,在numpy的,以達到所期望的行爲,我只需要聲明我的向量作爲二維數組與一列。換句話說,我需要用「列」 - 向量替換「行」向量(或者我需要垂直寫入值,而不是水平)。在這種情況下,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) 

這是我的錯誤:

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 way:

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(相同)列的矩陣,並且該矩陣可以與矩陣元素相乘(或相加)。