2015-09-08 7 views
5

Ho il seguente codice che memorizza 2 matrici in un tensore 3D.Matrici di stack Theano programmaticamente?

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) 

Tuttavia, non so quante volte ho bisogno di impilare la matrice in anticipo. Ad esempio la quarta linea di codice può essere:

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

C'è una funzione Teanò per duplicare una matrice n volte:

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

Allora posso passare che 3, come argomento della funzione Theano f. È possibile? Ho esaminato la trasmissione ma la trasmissione non modifica in modo esplicito dimensionalità/stack.

+0

Sei sicuro di aver bisogno di questo? Che problema stai cercando di risolvere? Principalmente, quando si verifica la replica matrice, il problema può essere formulato in modo diverso, evitandolo. Pubblicherò una risposta usando la trasmissione, solo per completare l'immagine, ma l'effettiva modifica che si desidera apportare dipende dal problema. – eickenberg

risposta

1

Non so su Theano, ma si potrebbe ottenere questo risultato utilizzando lista di comprensione e disimballaggio lista di argomenti:

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

che è equivalente a:

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

Quello che fa è, prima costruisce un elenco con n copie di A e quindi scompatta questo elenco in argomenti separati (vedere https://docs.python.org/2/tutorial/controlflow.html#unpacking-argument-lists).

+0

Grazie, funziona per le funzioni generali ma theano è un po 'diverso: f = theano.function (input = [A], outputs = B) crea una funzione theano, e la sintassi ideale sarebbe una cosa come questa: f = theano. function (inputs = [A, 5], outputs = B) – applecider

+0

@applecider Ho provato questo e ha funzionato anche nel tuo esempio. Ma dal momento che hai già un'altra soluzione, non importa. – jure

2

Dopo aver scavato a lungo e duramente attraverso la documentazione Theano ho trovato la soluzione:

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) 

è equivalente a:

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) 

tranne ora possiamo scegliere il numero di ripetizioni programatically come secondo argomento a: theano.tensor.extra_ops.repeat

2

Ecco un esempio utilizzando la trasmissione

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 

Questo approccio può aiutare il compilatore ad evitare la piastrellatura se può ottimizzarlo.