2015-09-08 29 views
5

2 matrisin 3D tensörüne yerleştirildiği aşağıdaki kod var.Theano yığın matrisleri programatik olarak mı?

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) 

Ancak, matrisi önceden yığmak için kaç kez ihtiyacım olduğunu bilmiyorum. Örneğin kod dördüncü hattı olabilir:

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

bir matris n defa çoğaltmak için bir Theano işlevi vardır:

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

Sonra geçebilir, 3 bu Theano işlev için bağımsız değişken olarak f. Mümkün mü? Yayına baktım ama yayıncılık boyutsallığı/yığını açıkça değiştirmiyor.

+0

Buna ihtiyacınız olduğuna emin misin? Ne problemi çözmeye çalışıyorsun? Çoğunlukla, matris replikasyonu ortaya çıktığında, sorun farklı şekilde formüle edilebilir ve bundan kaçınılabilir. Sadece resmi tamamlamak için yayınlamayı kullanarak bir cevap yayınlayacağım, ancak yapmak istediğiniz gerçek değişiklik probleme bağlı. – eickenberg

cevap

1

Ben Theano bilmem, ama bu liste kavrayışa ve açma argüman listesi başarabileceğini:

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

eşdeğerdir: Bu ne yapmasıdır

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

, bu ilk önce nA kopyaları ile bir liste oluşturur ve bu listeyi ayrı argümanlara paketler (bkz. https://docs.python.org/2/tutorial/controlflow.html#unpacking-argument-lists). Ben çözüm bulduk

+0

Teşekkürler, bu genel işlevler için çalışıyor ama theano biraz farklıdır: f = theano.function (input = [A], outputs = B) bir theano işlevi oluşturur ve ideal sözdizimi şöyle bir şey olurdu: f = theano. işlevi (girişler = [A, 5], çıkışlar = B) – applecider

+0

@applecider Bunu denedim ve aynı zamanda örnekte de çalıştı. Ama zaten başka bir çözüm bulduğunuz için gerçekten önemli değil. – jure

2

Theano belgelerine aracılığıyla uzun ve zor kazma sonra: şimdi ikinci olarak programlama tekrar sayısını seçebilir hariç

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) 

:

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) 

eşdeğerdir argüman için: theano.tensor.extra_ops.repeat

2

Yayın Örnekleri

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 

Bu yaklaşım, derleyiciyi optimize edebilecekse, derleyicinin zedelenmemesine yardımcı olabilir.

İlgili konular