沿三维的 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]