2015-09-08 12 views
5

Ich habe den folgenden Code, der 2 Matrizen in einen 3D-Tensor stapelt.Theano Stapelmatrizen programmgesteuert?

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) 

Allerdings weiß ich nicht, wie oft ich die Matrix im Voraus stapeln muss. Zum Beispiel kann die vierte Codezeile sein:

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

Gibt es eine Theanos Funktion eine Matrix n-mal zu duplizieren:

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

Dann kann ich das 3 passieren, als Argument an die Theano Funktion f. Ist das möglich? Ich habe mich mit Broadcasting beschäftigt, aber Broadcasting ändert Dimensionalität/Stack nicht explizit.

+0

Sind Sie sicher, dass Sie das brauchen? Welches Problem versuchen Sie zu lösen? Wenn Matrixreplikation auftritt, kann das Problem meist anders formuliert und vermieden werden. Ich werde eine Antwort mit Broadcasting posten, nur um das Bild zu vervollständigen, aber die tatsächliche Änderung, die Sie vornehmen möchten, ist problemabhängig. – eickenberg

Antwort

1

Ich weiß nicht, über Theano, aber man kann dies mit Liste Verständnis erreichen und Auspacken Argumentliste:

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

, die gleich ist:

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

Was dies bedeutet ist, es erstellt zuerst eine Liste mit n Kopien von A und entpackt dann diese Liste in separate Argumente (siehe https://docs.python.org/2/tutorial/controlflow.html#unpacking-argument-lists).

+0

Danke, das funktioniert für allgemeine Funktionen, aber das ist ein bisschen anders: f = theano.function (Eingänge = [A], Ausgänge = B) erstellt eine Theano-Funktion, und die ideale Syntax wäre etwa so: f = theano. Funktion (Eingänge = [A, 5], Ausgänge = B) – applecider

+0

@applicider Ich habe das versucht und es hat auch in Ihrem Beispiel funktioniert. Aber da Sie bereits eine andere Lösung haben, spielt es keine Rolle. – jure

2

Nach dem Graben lange und hart über die Theano Dokumentation ich die Lösung gefunden haben:

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) 

entspricht:

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) 

außer wir jetzt die Anzahl der Wiederholungen programmatisch als zweite wählen Argument zu: theano.tensor.extra_ops.repeat

2

Hier ist ein Beispiel mit Rundfunk

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 

Dieser Ansatz kann dem Compiler helfen, Kacheln zu vermeiden, wenn er dies optimieren kann.