wake-up-neo.com

Wie man reproduzierbare Ergebnisse in Keras erzielt

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? 

  1. Installieren Sie Keras ( http://keras.io/
  2. Führen Sie https://github.com/fchollet/keras/blob/master/examples/imdb_lstm.py einige Male aus. Es trainiert die Genauigkeit des Modells und des Ausgangstests.
    Erwartetes Ergebnis: Die Testgenauigkeit ist bei jedem Lauf gleich.
    Tatsächliches Ergebnis: Die Testgenauigkeit ist bei jedem Durchlauf unterschiedlich.

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)

47
Pavel Surmenok

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
13
PabTorre

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:

  1. Setze numpy.random.seed;
  2. Verwenden Sie 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:

  1. 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:

  1. ersetzen aller Aufrufe des *_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.

11
kepler

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:

  1. Setzen Sie die Umgebungsvariable PYTHONHASHSEED auf einen festen Wert
  2. Setzen Sie python eingebauten Pseudozufallsgenerator auf einen festen Wert
  3. Setzen Sie den numpy Pseudo-Zufallsgenerator auf einen festen Wert
  4. Setzen Sie den tensorflow Pseudo-Zufallsgenerator auf einen festen Wert
  5. Konfigurieren Sie eine neue globale tensorflow-Sitzung

Nach 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.

7
Poete Maudit

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

  1. setze numpy.random.seed am Anfang deines Codes
  2. geben Sie dem Python-Interpreter als Parameter PYTHONHASHSEED = 0
1
Alex

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:

  1. Docker . Wenn Sie ein Linux haben, ist es sehr einfach, Ihre Umgebung an einen anderen Ort zu verschieben. Sie können auch versuchen, DockerHub zu verwenden. 
  2. Binder . Dies ist eine Cloud-Plattform zur Wiedergabe wissenschaftlicher Experimente.
  3. Everware . Dies ist eine weitere Cloud-Plattform für "wiederverwendbare Wissenschaft". Siehe das Projekt-Repository auf Github.
0
Yelaman

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. 

0

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)
0