2014-11-12 5 views
21

Ich las den Code für die logistische Funktion unter http://deeplearning.net/tutorial/logreg.html gegeben. Ich bin verwirrt über den Unterschied zwischen inputs & givens Variablen für eine Funktion. Die Funktionen, die Fehler gemacht durch ein Modell auf einem mini berechnen sind:Zweck der "geben" Variablen in Theano.Funktion

test_model = theano.function(inputs=[index], 
     outputs=classifier.errors(y), 
     givens={ 
      x: test_set_x[index * batch_size: (index + 1) * batch_size], 
      y: test_set_y[index * batch_size: (index + 1) * batch_size]}) 

validate_model = theano.function(inputs=[index], 
     outputs=classifier.errors(y), 
     givens={ 
      x: valid_set_x[index * batch_size:(index + 1) * batch_size], 
      y: valid_set_y[index * batch_size:(index + 1) * batch_size]}) 

Warum nicht/konnte nicht ein nur x machen & y Eingangsgrößen geteilt und lassen Sie sie definiert werden, wenn eine tatsächliche Modellinstanz erstellt wird ?

Antwort

23

Der Parameter givens ermöglicht Ihnen, die Beschreibung des Modells und die genaue Definition der Eingangsvariablen zu trennen. Dies ist eine Konsequenz dessen, was der angegebene Parameter bewirkt: Modifizieren Sie das Diagramm vor dem Kompilieren, um es zu kompilieren. Mit anderen Worten, wir ersetzen im Graphen den Schlüssel in den gegebenen Werten durch den zugehörigen Wert.

Im Deep Learning-Tutorial verwenden wir eine normale Theano-Variable, um das Modell zu erstellen. Wir verwenden givens, um die GPU zu beschleunigen. Wenn wir das Dataset auf der CPU behalten, übertragen wir bei jedem Funktionsaufruf einen Minibatch an die GPU. Da wir viele Iterationen im Datensatz durchführen, übertragen wir den Datensatz mehrere Male auf die GPU. Da der Datensatz klein genug ist, um auf die GPU zu passen, legen wir ihn in eine gemeinsame Variable, um ihn an die GPU zu übertragen, falls eine verfügbar ist (oder in der Zentraleinheit bleibt, wenn die Graphics Processing Unit deaktiviert ist). Beim Kompilieren der Funktion tauschen wir dann die Eingabe mit einer Schicht aus, die dem Minibatch der zu verwendenden Datenmenge entspricht. Dann ist die Eingabe der Theano-Funktion nur der Index der Minibatch, die wir verwenden möchten.

+0

dies ist sehr hilfreich und verdeutlicht die Ideen, die ich von diesen Konzepten hatte, danke! – eickenberg

+0

@nouiz - Danke, lass mich sehen, wenn ich verstehe: – user1245262

+0

@nouiz - Danke, lassen Sie mich sehen, wenn ich verstehe: 1. Verwendung von 'gegeben' ist Theano Speicherverwaltung zwischen CPU und GPU (s) zu verbessern. 2. Ein 'gegebenes' erzeugt (?) Eine gemeinsame Variable * nur wenn * es in eine GPU gelegt werden kann. 3. Im Gegensatz zu Shared-Variablen behalten bestimmte Variablen den Status nicht bei - ich kann keine Updates für sie innerhalb der Funktion erstellen. Wenn sie sich außerhalb der Funktion ändern, hat dies keine Auswirkungen auf nachfolgende Aufrufe dieser Funktion ....... Haben Ich habe irgendwelche Kommissions- oder Unterlassungsfehler begangen? ... Thx. (Sorry - versehentlich eingegebener 1. Kommentar und dann zu lange Bearbeitung) – user1245262

1

Ich glaube nicht, dass irgendetwas Sie davon abhält, es so zu machen (ich habe das updates= Wörterbuch nicht mit einer Eingabevariablen direkt versucht, aber warum nicht). Beachten Sie jedoch, dass Sie, um Daten auf eine GPU in nützlicher Weise zu übertragen, benötigen, dass sie in einer gemeinsamen Variablen enthalten sind (von denen x und y in diesem Beispiel genommen werden).

+1

Also, wenn/warum entwerfe ich eine Funktion, um bestimmte Variablen anstelle von geteilten zu verwenden? – user1245262

+0

die Gegebenheiten in Ihrem Code ersetzen Eingabevariablen durch Variablen der gemeinsamen Variablen, so dass die Gegebenheiten nicht da sind "statt" – eickenberg