簡體   English   中英

如何在Theano中將矩陣的每一列乘以矢量元素方式?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM