Wie kann ich Tensors auf einen früheren Wert zurücksetzen, ohne den Wert auf der Festplatte zu speichern?

8

Ich mache ein paar Experimente mit TensorFlow und bin in einen Haken geraten. Ich versuche, TF zu verwenden, um eine Änderung in einem Modell zu bewerten, dann das Modell basierend auf der resultierenden Änderung der Verlustfunktion beizubehalten oder zurückzusetzen. Ich habe den harten Teil (bedingte Kontrolle) herausgefunden, aber ich stecke auf etwas fest, das ziemlich einfach sein sollte: Ich kann nicht scheinen, ein tf.trainable_variables für eine Iteration zu speichern und es dann wiederherzustellen, wenn es benötigt wird.

Sagen wir ein Build Op:

%Vor%

Dann möchte ich später tf.trainable_variables auf den Wert zurücksetzen, den es hatte, als dieser Op zuletzt ausgeführt wurde. Ich möchte etwas tun wie:

%Vor%

Offensichtlich wird store_trainable_vars neu bewertet, was wiederum mit dem aktuellen Wert von tf.trainable_variables() verknüpft ist, wodurch die revert_state Op vermieden wird. Ich brauche eine Möglichkeit, den Wert von Tensors zu speichern und abzurufen, ohne auf den aktuellen Wert dieser Tensoren zurückzugreifen. Etwas wie

%Vor%

wobei v.value_right_now() eine Konstante zurückgibt, die sich erst beim Überschreiben ändert.

Ich weiß, dass ich Saver verwenden kann, aber diese Lösung schreibt auf den Datenträger, was für diese Anwendung nicht akzeptabel ist, da sie innerhalb einer Trainingsschleife ausgeführt wird.

Ich vermisse wahrscheinlich etwas Offensichtliches - jede Anleitung wäre willkommen.

    
Justin Fletcher 24.09.2017, 19:26
quelle

2 Antworten

1

Es war nicht meine ursprüngliche Absicht, diese Frage selbst zu beantworten, aber ich habe eine Methode entwickelt, die ziemlich gut funktioniert. Also dachte ich, ich würde es teilen. Die wichtigste Erkenntnis kam von der sehr cleveren Antwort. Der Ansatz besteht darin, die für die initiale Variablenzuweisung erstellten Zuweisungsknoten wiederzuverwenden. Eine vollständige Klasse, die diesen Ansatz implementiert, ist unten angegeben.

%Vor%

Um sie zu verwenden, instanziieren Sie einfach die Klasse, rufen Sie die Methode start auf, um eine tf.Session zu übergeben, und rufen Sie die Methoden store und restore bei Bedarf in Ihrer imperativen Trainingsschleife auf. Ich habe diese Implementierung verwendet, um einen Optimierer zu erstellen, der ungefähr so ​​schnell läuft wie die Gradientenoptimierer, die in TensorFlow enthalten sind.

    
Justin Fletcher 07.10.2017, 07:14
quelle
5

Um den Status eines Diagramms manuell wiederherzustellen, müssen Sie tf.tuple oder tf.group Operation, die den Fluss für eine Massenänderung ändern:

  

Dies erzeugt ein Tupeltupel mit den gleichen Werten wie die Tensoren   Argument, außer dass der Wert jedes Tensors erst danach zurückgegeben wird   Die Werte aller Tensoren wurden berechnet.

[Update] So würde ich es machen:

%Vor%

Aber ich denke wirklich, dass du deine Entscheidung über Saver noch einmal überdenken solltest, weil sie auch für den Einsatz in einer Trainingsschleife entwickelt wurde. Intern erledigt Saver all die kniffligen Aufgaben für Sie (insbesondere die Wiederherstellungs-Op-Aufrufe tf.group und tf.control_dependencies , falls erforderlich), die ansonsten die Quelle für ziemlich schlimme Fehler werden könnten. Außerdem ist die Platte (fast) immer größer als Ihre GPU und der Hauptspeicher. Wenn Sie es sich also leisten können, das Modell im Speicher zu speichern, sollten Sie auch auf der Festplatte speichern können.

Hier sind einige Parameter , die helfen, die Verbreitung von Prüfpunktdateien auf der Festplatte zu kontrollieren:

  • max_to_keep gibt die maximale Anzahl der letzten Checkpoint-Dateien an behalten. Wenn neue Dateien erstellt werden, werden ältere Dateien gelöscht. Wenn Keine oder 0, werden alle Prüfpunktdateien beibehalten. Der Standardwert ist 5 (dh die 5 letzten Prüfpunktdateien werden beibehalten).
  • keep_checkpoint_every_n_hours : Zusätzlich zu den neuesten max_to_keep Checkpoint-Dateien, möchten Sie möglicherweise eine Prüfpunktdatei behalten für jede N Trainingsstunden. Dies kann nützlich sein, wenn Sie später möchten analysieren, wie sich ein Modell während einer langen Trainingseinheit entwickelt hat. Zum Beispiel: Durch die Übergabe von keep_checkpoint_every_n_hours=2 wird sichergestellt, dass Sie für alle 2 Stunden des Trainings eine Prüfpunktdatei behalten. Der Standardwert von 10.000 Stunden deaktiviert die Funktion effektiv.

[Update] Wie in den Kommentaren erläutert, ist das Hauptproblem die Festplattenlatenz, die das Training verlangsamen kann, wenn zu oft darauf zugegriffen wird. Wenn Sie Linux verwenden, verwendet Caches häufig Plattenseiten, Windows macht es auch . Aber wenn Sie absolut sicher sein wollen, sollten Sie tmpfs .

    
Maxim 01.10.2017 10:44
quelle