沿三维的 theano 向量矩阵乘积
theano vector matrix product along third dimension
我有 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 中做到这一点?
你正在寻找的是 numpy 中的这个(我将退化维度 (1, d) 扩展到 (6, 5) 以便对矩阵通用。如果 w
是向量,那么函数可能会用一维数组写得稍微简单一些)
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]
我有 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 中做到这一点?
你正在寻找的是 numpy 中的这个(我将退化维度 (1, d) 扩展到 (6, 5) 以便对矩阵通用。如果 w
是向量,那么函数可能会用一维数组写得稍微简单一些)
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]