Theano堆栈矩阵以编程方式?

时间:2015-09-08 11:57:37

标签: python theano

我有以下代码将2个矩阵堆叠成3D张量。

import theano
import theano.tensor as T
A = T.matrix("A")
B = theano.tensor.stack(A, A)
f = theano.function(inputs=[A], outputs=B)
print f([range(10)]*2)

但是,我不知道需要提前多少次堆叠矩阵。例如,第四行代码可能是:

B = theano.tensor.stack(A, A, A)
B = theano.tensor.stack(A, A, A, A)
etc...

是否有aano函数可以复制矩阵n次:

theano.some_function(A, 3) = theano.tensor.stack(A, A, A)

然后我可以传递那个3,作为theano函数f的参数。这可能吗?我研究了广播,但广播没有明确改变维度/堆栈。

3 个答案:

答案 0 :(得分:2)

通过theano文档深入挖掘后,我找到了解决方案:

import theano
import theano.tensor as T
A = T.matrix("A")
B = [A]
C = theano.tensor.extra_ops.repeat(B, 3, axis=0)
f = theano.function(inputs=[A], outputs=C)
print f([range(10)]*2)

相当于:

import theano
import theano.tensor as T
A = T.matrix("A")
B = theano.tensor.stack(A, A, A)
f = theano.function(inputs=[A], outputs=B)
print f([range(10)]*2)

除了我们现在可以以编程方式选择重复次数作为第二个参数:theano.tensor.extra_ops.repeat

答案 1 :(得分:2)

以下是使用广播

的示例
import theano
import theano.tensor as T
import numpy as np

A = T.fmatrix()
n = T.iscalar()

ones = T.ones((n, 1, 1))

stackedA = ones * A[np.newaxis, :, :]

f = theano.function([A, n], stackedA)

a = np.arange(30).reshape(5, 6).astype('float32')
nn = 3

r = f(a, nn)

print r.shape  # outputs (3, 4, 5)
print (r == a[np.newaxis]).all()  # outputs True

这种方法可以帮助编译器避免平铺,如果它可以优化它。

答案 2 :(得分:1)

我不知道theano,但你可以使用list comprehension和unpacking参数列表来完成这个:

n = 5
B = theano.tensor.stack(*[A for dummy in range(n)])

相当于:

B = theano.tensor.stack(A, A, A, A, A)

这样做,它首先构造一个包含n A个副本的列表,然后将此列表解包为单独的参数(参见https://docs.python.org/2/tutorial/controlflow.html#unpacking-argument-lists)。