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:
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
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.
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.
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
.
Tags und Links python tensorflow machine-learning