theano矢量矩阵乘积沿三维

时间:2015-07-30 17:14:18

标签: theano

我已经w = T.matrix('w')X = T.tensor3('X')

假设w为1xd,X为3 x 10 x d。

我想要一个大小为3 x 10的矩阵,其中第i行为w.dot(X[i,:,:].T)

有没有办法在theano中做到这一点?

1 个答案:

答案 0 :(得分:1)

你正在寻找的是numpy(我将退化维度(1,d)扩展到(6,5)以便对于矩阵是一般的。如果w是一个向量,那么函数可以用1D数组稍微简单地写一下)

import numpy as np

w = np.arange(6 * 5).reshape(6, 5)
X = np.arange(3 * 10 * 5).reshape(3, 10, 5)

output = np.einsum('ij, klj', w, X)

让我们检查第零输出

print w.dot(X[0].T)
print output[:, 0]   # same output as above

我们可以通过重塑矩阵来做同样的事情,这将使我们立即获得有效的Theano表达

output2 = w.dot(X.reshape(-1, 5).T).reshape((w.shape[0],) + X.shape[:2])
assert (output2 == output).all()

现在Theano表达

import theano
import theano.tensor as T

ww = T.fmatrix()
XX = T.tensor3()

output_expr = ww.dot(XX.reshape((-1, XX.shape[-1])).T).reshape((ww.shape[0], XX.shape[0], XX.shape[1]), ndim=3)

f = theano.function([ww, XX], output_expr)

print f(w.astype('float32'), X.astype('float32'))[:, 0]