Ich erhalte jedes Mal andere Ergebnisse (Testgenauigkeit), wenn ich das imdb_lstm.py
-Beispiel aus dem Keras-Framework ( https://github.com/fchollet/keras/blob/master/examples/imdb_lstm.py ) enthält np.random.seed(1337)
vor allen Keras-Importen. Es sollte verhindern, dass für jeden Lauf unterschiedliche Zahlen generiert werden. Was vermisse ich?
UPDATE: Wie kann man das wiederholen?
UPDATE2: Ich verwende es unter Windows 8.1 mit MinGW/msys, Modulversionen:
theano 0.7.0
numpy 1.8.1
scipy 0,14,0c1
UPDATE3: Ich habe das Problem etwas eingegrenzt. Wenn ich das Beispiel mit GPU (set theano flag device = gpu0) starte, bekomme ich jedes Mal eine andere Testgenauigkeit, aber wenn ich es auf der CPU starte, funktioniert alles wie erwartet. Meine Grafikkarte: NVIDIA GeForce GT 635)
Theanos Dokumentation spricht über die Schwierigkeiten beim Seeding von Zufallsvariablen und warum sie jede Graphinstanz mit ihrem eigenen Zufallszahlengenerator samen.
Teilen eines Zufallszahlengenerators zwischen verschiedenen {{{{RandomOp}}} Instanzen machen es schwierig, denselben Stream zu erzeugen, unabhängig davon von anderen Operationen in der Grafik, und {{{RandomOps}}} isoliert zu halten . Daher hat jede {{{{RandomOp}}} -Instanz in einem Graphen sehr eigener Zufallszahlengenerator. Dieser Zufallszahlengenerator ist eine Eingabe zur Funktion. In der Regel werden wir die neuen Funktionen von .__ verwenden. Funktionseingaben ({{{value}}}, {{{update}}}) zum Übergeben und Aktualisieren des Befehls für jede {{{{RandomOp}}}. Durch Übergeben von RNGs als Eingaben ist es möglich, Verwenden Sie die normalen Methoden für den Zugriff auf die Funktionseingaben, um auf alle .__ zuzugreifen. {{{{RandomOp}}} s rng. Bei diesem Ansatz gibt es keine Voreinstellung Mechanismus zum Arbeiten mit dem kombinierten Zufallszahlenstatus eines gesamten Graph. Daher ist der Vorschlag, die fehlende Funktionalität (die letzten drei Anforderungen) über Hilfsfunktionen bereitzustellen: {{{seed, getstate, setstate}}}.
Sie bieten auch Beispiele wie man alle Zufallszahlengeneratoren sät.
Sie können auch alle Zufallsvariablen samen, die von einem .__ zugewiesen werden. RandomStreams-Objekt nach der Seed-Methode dieses Objekts. Dieser Samen wird .__ sein. verwendet, um einen temporären Zufallszahlengenerator zu samen, der wiederum Seeds für jede der Zufallsvariablen erzeugen.
>>> srng.seed(902340) # seeds rv_u and rv_n with different seeds each
Endlich habe ich mit meinem Code reproduzierbare Ergebnisse erhalten. Es ist eine Kombination von Antworten, die ich im Web gesehen habe. Als Erstes tun Sie, was @alex sagt:
numpy.random.seed
;PYTHONHASHSEED=0
für Python 3.Dann müssen Sie das von @ user2805751 angegebene Problem bezüglich cuDNN lösen, indem Sie Ihren Keras-Code mit dem folgenden zusätzlichen THEANO_FLAGS
aufrufen:
dnn.conv.algo_bwd_filter=deterministic,dnn.conv.algo_bwd_data=deterministic
Und zum Schluss müssen Sie Ihre Theano-Installation nach diesem Kommentar aktualisieren, der im Wesentlichen besteht aus:
*_dev20
-Operators durch seine reguläre Version in theano/sandbox/cuda/opt.py
.Dies sollte Ihnen die gleichen Ergebnisse für den gleichen Samen bringen.
Beachten Sie, dass es zu einer Verlangsamung kommen kann. Ich habe eine Laufzeitsteigerung von etwa 10% gesehen.
Sie finden die Antwort unter Keras docs: https://keras.io/getting-started/faq/#how-can-i-obtain-reproducible-results-using-keras-during-development .
Kurz gesagt: Um absolut sicher zu sein, dass Sie mit Ihrem Python-Skript auf der CPU eines Computers/Laptops reproduzierbare Ergebnisse erhalten, müssen Sie Folgendes tun:
PYTHONHASHSEED
auf einen festen Wertpython
eingebauten Pseudozufallsgenerator auf einen festen Wertnumpy
Pseudo-Zufallsgenerator auf einen festen Werttensorflow
Pseudo-Zufallsgenerator auf einen festen Werttensorflow
-SitzungNach dem Keras
-Link am oberen Ende verwende ich den folgenden Quellcode:
# Seed value
# Apparently you may use different seed values at each stage
seed_value= 0
# 1. Set `PYTHONHASHSEED` environment variable at a fixed value
import os
os.environ['PYTHONHASHSEED']=str(seed_value)
# 2. Set `python` built-in pseudo-random generator at a fixed value
import random
random.seed(seed_value)
# 3. Set `numpy` pseudo-random generator at a fixed value
import numpy as np
np.random.seed(seed_value)
# 4. Set `tensorflow` pseudo-random generator at a fixed value
import tensorflow as tf
tf.set_random_seed(seed_value)
# 5. Configure a new global `tensorflow` session
from keras import backend as K
session_conf = tf.ConfigProto(intra_op_parallelism_threads=1, inter_op_parallelism_threads=1)
sess = tf.Session(graph=tf.get_default_graph(), config=session_conf)
K.set_session(sess)
Es ist unnötig zu erwähnen, dass Sie keine seed
oder random_state
in den numpy
, scikit-learn
oder tensorflow
/keras
Funktionen angeben müssen, die Sie in Ihrem Python verwenden Skript genau deshalb, weil wir mit dem obigen Quellcode ihre Pseudozufallsgeneratoren global auf einen festen Wert setzen.
Ich möchte den vorherigen Antworten etwas hinzufügen. Wenn Sie python 3 verwenden und für jeden Lauf reproduzierbare Ergebnisse erhalten möchten, müssen Sie dies tun
Ich stimme dem vorherigen Kommentar zu, aber für reproduzierbare Ergebnisse ist manchmal dieselbe Umgebung erforderlich (z. B. installierte Pakete, Maschineneigenschaften usw.). Daher empfehle ich, Ihre Umgebung an einen anderen Ort zu kopieren, um reproduzierbare Ergebnisse zu erhalten. Versuchen Sie, eine der nächsten Technologien zu verwenden:
Ich habe Sequential()
Art von neuronalen Netzwerken mit Keras trainiert und getestet. Ich habe eine nichtlineare Regression für verrauschte Sprachdaten durchgeführt. Ich habe den folgenden Code verwendet, um zufällige Startwerte zu erzeugen:
import numpy as np
seed = 7
np.random.seed(seed)
Ich bekomme jedes Mal genau die gleichen Ergebnisse von val_loss
, wenn ich mit denselben Daten trainiere und teste.
Das funktioniert bei mir:
SEED = 123456
import os
import random as rn
import numpy as np
from tensorflow import set_random_seed
os.environ['PYTHONHASHSEED']=str(SEED)
np.random.seed(SEED)
set_random_seed(SEED)
rn.seed(SEED)