2016-10-13 3 views
0

私は特定の軸の上に繰り返す必要があるので、私はできるだけ多くの不必要なメモリの再割り当てを避けたいです。「broadcast_to」方法をnumpyのためにtheano操作と同等はありますか?

たとえば、形状が(3、4、5)のnumpy配列Aがある場合、元のAに形状(3、4、100、5)のBという名前のビューを作成したいとします。 Aの第3軸は100回繰り返されます。

numpyのでは、これは次のように達成することができます。後者はちょうどビューを作成しながら、前者は、いくつかのコピーものを行う、新しいメモリを割り当て、

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

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

か余分なメモリの再割り当てなしでA以上。これが答えに記載の方法により識別することができます。

はtheanoでは、しかし、theano.tensor.repeatはもちろん、それは好ましくないですが、唯一の方法であると思われます。

theanoメソッドが効率的にこれを行うことができるような `numpy.broadcast_to 'があるのだろうか?

答えて

0

いくつかの次元

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

上theano変数broadcastableを作る素敵な方法のdimshuffleは、今、あなたは、ここで、(5、3,4、 'X')形状を持つテンソルの変数を持っているがあります'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。

+0

まず第一に、あなたの答えをありがとうございました。しかし、このようにして、Ctは新たに作成されたゼロ4dテンソルのために余分なメモリストレージを必要とし、そのメモリ効率はtheano.repeatオペレーションと同じように見えます。 – Tqri

関連する問題