我有一个含有100个元素的Theano dvector
。我还有一个包含5列和100行的矩阵(换句话说,每列包含100个元素)。
现在我需要通过向量应用每列的逐元素乘法。在Theano中这样做的正确方法是什么?
我应该通过重复我的矢量5次并转置它然后将两个相同形状的矩阵相乘来创建一个新的矩阵吗?
ADDED
我已经学会了numpy,为了达到理想的行为,我只需要将我的矢量声明为一列二维数组。换句话说,我需要用“column”-vectors替换“row”-vector(或者我需要垂直地而不是水平地写入值)。在这种情况下,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]])
答案 0 :(得分:0)
我找到的“原生”解决方案是使用theano.tensor.extra_ops.repeat操作。更多细节,我需要使用
Xr = T.extra_ops.repeat(X, 3, axis=1)
此操作将重复列向量3次。因此,我们将获得一个包含3个(相同)列的矩阵,并且该矩阵可以与W
矩阵元素相乘(或求和)。