【问题标题】:How to multiply each column of a matrix by a vector element-wise in Theano?如何在 Theano 中将矩阵的每一列乘以向量元素?
【发布时间】:2016-12-27 15:22:45
【问题描述】:

我有一个包含 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]])

【问题讨论】:

    标签: python theano elementwise-operations


    【解决方案1】:

    我发现的“本机”解决方案是使用theano.tensor.extra_ops.repeat 操作。更详细的,我需要使用

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

    此操作将重复列向量 3 次。因此,我们将得到一个包含 3 个(相同)列的矩阵,并且该矩阵可以与 W 矩阵元素相乘(或相加)。

    【讨论】:

      猜你喜欢
      • 2019-03-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多