如何在Theano中增加Tensors

时间:2016-04-08 11:26:06

标签: theano deep-learning dot-product

我在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但似乎很混乱。

请注意,执行此操作的无效方法是使用扫描功能。但这会产生一个固有的并行代码顺序。

1 个答案:

答案 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)

上面的代码给出了相同的结果。希望它有所帮助。