我已经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中做到这一点?
答案 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]