[英]How to multiply each column of a matrix by a vector element-wise in Theano?
我有一個100個元素的Theano dvector
。 我也有一個包含5列和100行的矩陣(換句話說,每列包含100個元素)。
現在,我需要對向量的每一列進行逐元素乘法。 在Theano中做到這一點的正確方法是什么?
我是否應該通過將向量重復5次並轉置然后將兩個相同形狀的矩陣逐元素相乘來創建一個新矩陣?
添加
我了解到,在numpy中,要實現所需的行為,我只需要將向量聲明為具有一列的2D數組即可。 換句話說,我需要用“列”向量替換“行”向量(或者我需要垂直而不是水平地寫入值)。 在這種情況下,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
,則代碼可以正常工作:
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]])
我發現的“本機”解決方案是使用theano.tensor.extra_ops.repeat操作。 更詳細地講,我需要使用
Xr = T.extra_ops.repeat(X, 3, axis=1)
此操作將重復列向量3次。 因此,作為結果,我們將獲得一個具有3個(相同)列的矩陣,並且可以將該矩陣與W
矩陣元素明智地相乘(或相加)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.