[PYTHON] Stellen Sie die Reproduzierbarkeit mit tf.keras in Tensorflow 2.3 sicher

Einführung

In TensorFlow gibt es eine Möglichkeit, die Reproduzierbarkeit durch Fixieren des Seeds wie im folgenden Artikel gezeigt aufrechtzuerhalten. In der GPU-Umgebung von TensorFlow 2.3 führte das Fixieren des Seeds allein jedoch nicht jedes Mal zum gleichen Ergebnis. (In Tensorflow 2.1 oder 2.0 denke ich, dass das gleiche Ergebnis nur durch Fixieren des Samens erzielt wurde ...)

Ich habe mehrmals versucht, die Kreuzungsüberprüfung durchzuführen, und habe das gleiche Ergebnis erzielt (ich konnte die Reproduzierbarkeit bestätigen). Daher werde ich es als Memorandum zusammenfassen. Der zur Überprüfung verwendete Quellcode wird auf Github veröffentlicht. Bitte weisen Sie auf Fehler oder Korrekturen hin.

Fazit

Zunächst werde ich die Schlussfolgerung schreiben, aber wie im folgenden Artikel beschrieben, sollten Sie anscheinend die Einstellung von tf.config.threading und die Umgebungsvariablen TF_DETERMINISTIC_OPS und TF_CUDNN_DETERMINISTIC ändern.

In TensorFlow 2.3 scheint die Reproduzierbarkeit erhalten zu sein, indem eine Funktion erstellt wird, die Zufallszahlen wie unten gezeigt initialisiert und zu Beginn des Programms aufruft.


def setSeed(seed):
    os.environ['PYTHONHASHSEED'] = '0'
    
    tf.random.set_seed(seed)
    np.random.seed(seed)
    random.seed(seed)
    
    os.environ['TF_DETERMINISTIC_OPS'] = '1'
    os.environ['TF_CUDNN_DETERMINISTIC'] = '1'

    tf.config.threading.set_inter_op_parallelism_threads(1)
    tf.config.threading.set_intra_op_parallelism_threads(1)

Laut der offiziellen Dokumentation wird die Leistung auf Kosten der Parallelverarbeitung beeinträchtigt. Ich dachte, es wäre in Ordnung, nur die Schlussfolgerung zu schreiben, aber ich fragte mich, ob es wahr ist, also führte ich eine Kreuzvalidierung durch und bestätigte tatsächlich, ob die Reproduzierbarkeit erhalten blieb.

Quellcode zur Überprüfung verwendet

Ich werde nur die Hauptpunkte des in Github platzierten Codes zusammenfassen.

--__ main.py__: Führen Sie eine Kreuzvalidierung (n = 10) für das Trainingsbild von MNIST durch, um den Verlust und die Genauigkeit des Lernens 10 Mal zu erhalten.

--__ eval.py__: Gibt die durchschnittliche Verteilungs- und Verarbeitungszeit aus der gespeicherten Textdatei aus. ――Da die Kreuzverifizierung zehnmal durchgeführt wird und die Varianz jeder Kreuzverifizierung 0 beträgt, wird beurteilt, dass genau das gleiche Ergebnis = Reproduzierbarkeit bestätigt werden kann. --main.py generiert Textdateien, also laden Sie sie.

--___ run_all.sh (für Ubuntu) oder run_all.ps1 (für Win) ___: Dies ist ein Skript, das main.py 10 Mal wiederholt und schließlich eval.py ausführt.

--__ docker-compose.yml, env / Dockerfile__: Dies ist eine Datei für Docker. (Für Linux)

Prüfergebnis

Dieses Mal habe ich es mit TensorFlow 2.3 + Python 3.7.7 unter Windows 10 ausgeführt. Der Durchschnitt der Varianzen jeder Kreuzungsverifizierung (Varianz) und die Gesamtzeit bis zum Speichern des nächsten Ergebnisses (Time_diff_total) sind wie folgt.

                                Variance, Time_diff_total
   results\with_tf_option.txt:     0.0,       0:17:11     #1037 Sekunden
results\without_tf_option.txt:  6.694e-07,    0:13:45        #825 Sekunden

Mit dieser Option ist die Verteilung 0, sodass Sie davon ausgehen können, dass das Ergebnis der zehnmaligen Ausführung von 10 Kreuzungsüberprüfungen genau das gleiche war. Wenn Sie jedoch versuchen, die Reproduzierbarkeit sicherzustellen, dauert es ungefähr 104 Sekunden, um das nächste Ergebnis zu erreichen, und wenn Sie die Reproduzierbarkeit verwerfen, dauert es ungefähr 82 Sekunden, um den nächsten Vorgang abzuschließen. Da es außer dem Training keinen zeitaufwändigen Prozess gibt, scheint die Leistung zu sinken, wenn die Reproduzierbarkeit gemäß dem offiziellen Dokument gewährleistet ist.

Übrigens waren der Verlust und die Genauigkeit des ersten und zweiten Mal mit und ohne Option wie folgt. (Es ist nicht erforderlich, es zweimal zu veröffentlichen, da die Varianz 0 ist, aber ich werde das Rohergebnis nur für den Fall veröffentlichen.)

#Mit Optionen(Häufigkeit, Verlust, Genauigkeit)
20201002-230020
0 0.041036274284124374 0.987500011920929
1 0.0490814633667469 0.9860000014305115
2 0.05664192885160446 0.9831666946411133
3 0.05320063605904579 0.9833333492279053
4 0.04623125120997429 0.9850000143051147
5 0.047372110188007355 0.984333336353302
6 0.05214701220393181 0.9850000143051147
7 0.03892550244927406 0.9858333468437195
8 0.047721363604068756 0.9851666688919067
9 0.05081837624311447 0.984499990940094
20201002-230216
0 0.041036274284124374 0.987500011920929
1 0.0490814633667469 0.9860000014305115
2 0.05664192885160446 0.9831666946411133
3 0.05320063605904579 0.9833333492279053
4 0.04623125120997429 0.9850000143051147
5 0.047372110188007355 0.984333336353302
6 0.05214701220393181 0.9850000143051147
7 0.03892550244927406 0.9858333468437195
8 0.047721363604068756 0.9851666688919067
9 0.05081837624311447 0.984499990940094

#Keine Optionen
20201002-231902
0 0.039828840643167496 0.9888333082199097
1 0.049601536244153976 0.9866666793823242
2 0.05240510031580925 0.9850000143051147
3 0.05293559655547142 0.9850000143051147
4 0.04633906111121178 0.9850000143051147
5 0.04794950410723686 0.9850000143051147
6 0.053883280605077744 0.9838333129882812
7 0.03880513831973076 0.987333357334137
8 0.04899284988641739 0.9850000143051147
9 0.0499492883682251 0.9851666688919067
20201002-232034
0 0.04064466059207916 0.987666666507721
1 0.04839828982949257 0.9851666688919067
2 0.055755823850631714 0.984499990940094
3 0.05341317877173424 0.9829999804496765
4 0.046509750187397 0.9856666922569275
5 0.04652954265475273 0.9853333234786987
6 0.05223047733306885 0.984666645526886
7 0.039393164217472076 0.9869999885559082
8 0.048276182264089584 0.9854999780654907
9 0.04923468455672264 0.9848333597183228

Impressionen

Aufgrund der Arbeit an der höheren Version von TensoFlow hatte ich Probleme, weil ich die Reproduzierbarkeit nicht bestätigen konnte. Daher bin ich froh, dass ich sie nur durch Hinzufügen der Umgebungsvariablen und Optionseinstellungen lösen konnte. Ich habe mit einem einfachen neuronalen Netzwerk für dieses Modell experimentiert, aber ich denke, dass ein Netzwerk mit mehr Schichten in der tatsächlichen Umgebung verwendet wird. Daher frage ich mich, wie stark sich die diesmal geänderte Einstellung auf die Leistung auswirkt. (Wenn Sie bereits eine haben, lassen Sie es mich bitte wissen)

Geschichte

2020/10/03 Erklärung zum veröffentlichten und geschriebenen Code hinzugefügt

Recommended Posts

Stellen Sie die Reproduzierbarkeit mit tf.keras in Tensorflow 2.3 sicher
Setzen Sie TensorFlow mit pip3 in die P2-Instanz
Zundokokiyoshi mit TensorFlow
Brechen Sie Blöcke mit Tensorflow
Implementieren Sie FReLU mit tf.keras
Daten mit TensorFlow lesen
Bootsrennen Vorhersage mit TensorFlow
Versuchen Sie eine Regression mit TensorFlow
[TensorFlow 2.x (tf.keras)] Zufälliger Startwert zur Verbesserung der Reproduzierbarkeit behoben
[TensorFlow 2 / Keras] Ausführen des Lernens mit CTC Loss in Keras
Verwenden Sie "% tensorflow_version 2.x", wenn Sie TPU mit Tensorflow 2.1.0 in Colaboratory verwenden
Übersetzen Erste Schritte mit TensorFlow
Versuchen Sie es mit TensorFlow
Verwenden Sie TensorFlow mit Intellij IDEA
Schaben mit Selen in Python
Betreiben Sie LibreOffice mit Python
Clipping und Normalisierung in TensorFlow
Schaben mit Chromedriver in Python
Ungefähre Sinusfunktion mit TensorFlow
Debuggen mit pdb in Python
Umgang mit Sounds in Python
Scraping mit Selen in Python
Aktienkursprognose mit Tensorflow
Scraping mit Tor in Python
Tweet mit Bild in Python
Korrigieren Sie zufällige Samen mit TensorFlow
Kombiniert mit Ordnungszahl in Python
Versuchen Sie TensorFlow MNIST mit RNN
TensorFlow 2.X & TensorRT ist der erste Schritt, um die Inferenz zu beschleunigen
Umgang mit Cudnn-Handle konnte nicht erstellt werden: CUDNN_STATUS_INTERNAL_ERROR in Tensorflow v2.x.
Umgang mit Tensorflow mit GPU beim Deep Learning, das plötzlich nicht mehr funktioniert