2016-07-25 8 views
0

Ich bin ein tensorflow Graph von folgendem Format schreiben:Tensorflow: Diagramm über die Bewertung abhängig Gebäude

def process_label(label): 
    return some_operation(label.eval()) 

Input: X, Label 
output,state = NN_Layers() 
processed_output = process_data(output) 
processed_label = process_label(processed_output, Label) 
loss = cross_entropy(processed_output, processed_label) 
optimize = GradientDescentOptimizer.minimize(loss) 

Session.run(optimize, feed_dict{X:input, Label:label}) 

Das Problem mit diesem Modell ist, dass ich die Werte der Ausgabe benötigen, um mein Label den Weg zu verarbeiten I Ich will es, damit ich den Verlust berechnen kann. Wenn ich versuche, output.eval (session) hier zu verwenden, wird es nicht funktionieren, weil meine Sitzung den gesamten Graphen ausführt und ich daher nur am Ende aufrufen kann.

Ich frage mich, ob es s a way I can break this graph apart in two and still have the gradient descent work through the network, or if there s jede andere Möglichkeit, dies zu tun.

+0

Wenn Sie den Verlustwert berechnen und Gradientenabstieg gleichzeitig ausführen möchten, können Sie einfach '_, loss_value = session.run ([optimize, loss], feed_dict = ...)' ausführen. – fwalch

+0

Es tut mir leid, ich war nicht wirklich klar. Um den Verlust zu berechnen, muss ich den Wert processed_label haben, und in process_label() muss ich Berechnungen mit dem Wert der Tensoren durchführen und daher Tensor.eval() verwenden. Ich konnte nicht den gesamten Graphen erstellen, da es auf dieser Auswertung beruht. – Michel

Antwort

0

Es kann ein Fehler in diesen sein, aber hier sind zwei Ideen mit zu beginnen: 1) leicht gegenüber 2) effizient:

1) Setzen Sie alles in einem Diagramm, als ob Sie die Etiketten haben Sie wollen. Einmal ausführen, um die Ausgaben zu erhalten (nur die Platzhalter, die für die Ausgaben benötigt werden, benötigt Tensorflow den Beschriftungs-Platzhalter dafür nicht). Führen Sie dann den Trainingsvorgang aus, indem Sie den Etikettenplatzhalter und wieder die Platzhalter für die Ausgaben eingeben. Es wird alle Operationen erneut ausführen, um "Ausgaben" zu berechnen, also nicht effizient.

2) Tun Sie es mit zwei separaten Grafiken (zwei Sitzungen könnten auch notwendig sein?). Berechnen Sie die Ausgänge und den Gradienten der Ausgänge in Bezug auf die trainierbaren Variablen (tf.gradienten) in Grafik 1, berechnen Sie Ihre Beschriftungen nach Bedarf, berechnen Sie Gradienten der Dämpfung in Bezug auf die Ausgänge in Grafik 2 (tf.gradienten) (Ausgänge sind ein Platzhalter in Grafik 2), multiplizieren Sie die Gradienten, um den Gradient des Verlustes in Bezug auf die Variablen zu erhalten, und optizer.apply_gradients() in Grafik 1.

Edit: eigentlich können Sie eine Grafik in Option 2 verwenden. Sie können die Ausgabe für den Ausgangstensor direkt wieder einspeisen, wenn Sie d_loss/d_output berechnen und die Operationen zur Berechnung der Ausgabe abkürzen. d. h. feed_dict ist nicht auf Platzhalter beschränkt.

+0

Danke, ich werde auf jeden Fall für die zweite Option gehen, das ist, was ich gesucht habe, ich habe einfach nicht genug Mathe, es ist die ganze Kettenregel, richtig? Noch einmal vielen Dank. – Michel

+0

ja, Kettenregel. 'dloss/dvariable_i = sum_j dloss/doutput_j * doutput_j/dvariable_i'. Wenn Sie 'tf.gradients()' näher betrachten, benötigen Sie für jeden 'output_j' eine' tf.gradients() '-Operation. 'tf.gradients()' scheint alle 'dvariable_i's über die mitgelieferten Ausgaben zu summieren, aber Sie brauchen sie separat, um die obige Multiplikation durchzuführen. Schließlich, da die Graphen die gleichen sind, kann es, abgesehen von der Hinzufügung von Gradienten, am einfachsten sein, mit 1) zu beginnen und zu 2) weiterzugehen, wenn Sie optimieren wollen. –

1

Sie können py_func verwenden, um jede Berechnung als Tensorflussoperationsoperation einzubinden. Das funktioniert in verteilten Einstellungen nicht gut, aber Sie können beliebige Berechnungen in einen Tensorflussgraphen einfügen.

Wenn Sie nicht etwas sehr kompliziertes in den process_* Funktionen tun, sollten Sie sie in Tensorflow Ops schreiben. Die meiste Zeit ist das einfacher als du denkst. Wenn bestimmte Funktionen fehlen, erstellen Sie eine Featureanforderung.

+0

Danke. Ich werde das untersuchen. – Michel

+0

Ok, es sieht so aus, als könnte ich ein paar Funktionen einpacken, aber es gibt andere, die bestimmte Bibliotheken benutzen und es wäre extrem kompliziert, wenn überhaupt, dies zu tun. Auch ich plane, dies in einer verteilten Umgebung zu verwenden. Gibt es eine andere Möglichkeit, an die Sie denken können? – Michel