我在Theano有两个张量和一个权重矩阵。 张量A具有尺寸(k,5,40)。张量B具有尺寸(k,5,40)。重量矩阵W具有尺寸(40,40)。我想计算 A w ^ B中。实现这一目标的Theano张量操作的正确顺序是什么?请注意,k在运行时可能会有所不同,但其他尺寸是固定的。 我们想要从A W B获得的语义如下:
将A视为k(5,40)矩阵的集合。称他们为A_1,...,A_k 将B视为k(5,40)矩阵的集合。称他们为B_1,...,B_k。 我们希望从1到k找到所有i的A_ {i} * W * B_ {i} ^ {T}。我尝试过使用theano.tensor.dot但似乎很混乱。
请注意,执行此操作的无效方法是使用扫描功能。但这会产生一个固有的并行代码顺序。
答案 0 :(得分:1)
对不起,但我不知道你的意思是什么“令人困惑”?
我尝试使用小盒子,我希望它可以代表你的情况。在三维张量和二维矩阵之间使用theano.tensor.dot
的点积:
import numpy as np
import theano
import theano.tensor as T
a = T.tensor3('a', dtype='int64')
c = T.matrix('c',dtype='int64')
d = T.dot(a,c)
g = theano.function([a,c],d)
x = np.array([[[1,2],[1,3]],[[2,2],[1,1]]], dtype=int)
y = np.array([[1,2],[1,3]], dtype=int)
print g(x,y)
输出:
[[[ 3 8]
[ 4 11]]
[[ 4 10]
[ 2 5]]]
它就像你的逻辑一样,矩阵c
只在二维和三维中做点积。
<强>更新强>
上面的第一个代码,您可以在您的情况下使用第一个操作(A * W)。对不起,我没有仔细计算,当然在那次操作之后输出变成了三维张量。因此,要执行(AW)* B,您必须使用不同的方法。为了在两个三维张量之间进行乘法,我通常使用扫描:
import numpy as np
import theano
import theano.tensor as T
a = T.tensor3('a', dtype='int64')
c = T.tensor3('c',dtype='int64')
d, b = theano.scan(lambda i: T.dot(a[i,:], c[i,:]),sequences=T.arange(2))
g = theano.function([a,c],d)
x = np.array([[[1,2],[1,3]],[[2,2],[1,1]]], dtype=int)
y = np.array([[[1,2],[1,3]],[[2,2],[1,1]]], dtype=int)
print g(x,y)
但我知道还有另一种使用theano.tensor.batched_dot
的方法(theano.tensor.dot
我认为只适用于2D和1D数组)。在你的情况下,这样编码很简单:
e = T.batched_dot(a,c)
g = theano.function([a,c],e)
上面的代码给出了相同的结果。希望它有所帮助。