有没有相当于numpy "broadcast_to"方法的theano操作?



由于我需要在特定的轴上重复,因此我希望尽可能避免不必要的内存重新分配。

例如,给定一个形状为(3,4,5)的numpy数组A,我想在原始A上创建一个形状为(3,4,100,5)的视图BA的第三轴重复100次。

在numpy中,可以这样实现:

    B=numpy.repeat(A.reshape((3, 4, 1, 5)), repeats=100, axis=2)

或:

    B=numpy.broadcast_to(A.reshape((3, 4, 1, 5)), repeats=100, axis=2)

前者分配一个新的内存,然后做一些复制的事情,而后者只是在A上创建一个视图,没有额外的内存重新分配。这可以通过答案中描述的方法来识别numpy跨行数组/广播数组在内存中的大小?.

在ano,然而,theano.tensor.repeat似乎是唯一的方法,当然它不是可取的。

我想知道是否有一个"numpy"。Broadcast_to '像ano方法可以有效地做到这一点吗?

有一个很好的方法dimshuffle,它使theano变量可以在某个维度上广播

At = theano.tensor.tensor3()
Bt = At.dimshuffle(0,1,'x',2)

现在你得到了一个形状为(3,4,'x',5)的张量变量,其中'x'表示你想添加的任何维度。

Ct=theano.tensor.zeros((Bt.shape[0],Bt.shape[1],100,Bt.shape[3]))+Bt

例子
f=theano.function([At],[Bt,Ct])
A = np.random.random((3,4,5)).astype(np.float32)
B,C=f(A)
print B.shape
print C.shape

(3, 4, 1, 5)

(3, 4, 100, 5)

除非指定,否则最好使用变量Bt。

最新更新