我有以下代码将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的参数。这可能吗?我研究了广播,但广播没有明确改变维度/堆栈。
答案 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)。