2015-09-06 5 views
40

-je obtenir des résultats différents (précision de test) à chaque fois que je lance le imdb_lstm.py exemple de cadre Keras (https://github.com/fchollet/keras/blob/master/examples/imdb_lstm.py) Le code contient np.random.seed(1337) en haut, avant toute importation de KERAS. Cela devrait l'empêcher de générer des nombres différents pour chaque exécution. Qu'est-ce que je rate?Comment obtenir des résultats reproductibles dans keras

MISE À JOUR: Comment repro:

  1. Installer Keras (http://keras.io/)
  2. Execute https://github.com/fchollet/keras/blob/master/examples/imdb_lstm.py quelques fois. Il formera le modèle et la précision du test de sortie.
    Résultat attendu: La précision du test est la même à chaque passage.
    Résultat: la précision du test est différente à chaque passage.

MAJ2: Je suis en cours d'exécution sur Windows 8.1 avec MinGW/MSYS, versions module:
Theano 0.7.0
numpy 1.8.1
scipy 0.14.0c1

Update3: Je plissant le problème un peu. Si je lance l'exemple avec GPU (set theano flag device = gpu0) alors j'obtiens une précision de test différente à chaque fois, mais si je l'exécute sur CPU, tout fonctionne comme prévu. Ma carte graphique: NVIDIA GeForce GT 635)

+0

Je ne peux pas reproduire l'exécution du code sur ubuntu 14.04 –

+0

'Théano -> 0.6.0',' numpy -> « 1.9.2'',' scipy -> '0.15.1' ' –

+0

Peut-être que le problème est que J'utilise Windows. numpy.random.uniform fonctionne bien, produit toujours les mêmes résultats. –

Répondre

10

Theano's documentation parle des difficultés d'ensemencement des variables aléatoires et pourquoi ils ensemencent chaque instance de graphique avec son propre générateur de nombres aléatoires.

Partage d'un générateur de nombres aléatoires entre les différentes {{{RandomOp}}} cas, il est difficile de produire le même flux indépendamment d'autres opérations dans le graphique, et de garder {{{RandomOps}}} isolé. Par conséquent, chaque instance de {{{RandomOp}}} dans un graphique aura son propre générateur de nombres aléatoires . Ce générateur de nombres aléatoires est une entrée à la fonction. Dans un usage typique, nous utiliserons les nouvelles fonctionnalités des entrées de fonction ({{{value}}}, {{{update}}}) pour passer et mettre à jour le rng pour chaque {{{RandomOp}}}. En passant les RNG comme entrées, il est possible de d'utiliser les méthodes normales d'accès aux entrées de fonction pour accéder à chaque {{{RandomOp}}}. Dans cette approche, il n'existe pas de mécanisme préexistant pour fonctionner avec l'état de nombre aléatoire combiné d'un graphique complet . Donc, la proposition est de fournir la fonctionnalité manquante (les trois dernières exigences ) via des fonctions auxiliaires: {{{seed, getstate, setstate}}}.

Ils fournissent également examples sur la façon de semer tous les générateurs de nombres aléatoires.

Vous pouvez également graver toutes les variables aléatoires allouées par un objet RandomStreams par la méthode de base de cet objet. Cette graine sera utilisée pour ensemencer un générateur de nombre aléatoire temporaire, qui à son tour génèrera des graines pour chacune des variables aléatoires.

>>> srng.seed(902340) # seeds rv_u and rv_n with different seeds each 
+8

Mais pour les semer, nous devons avoir accès aux objets aléatoires de theano que keras utilisera. Est-il possible de faire via l'API keras? – max

0

Je suis d'accord avec le commentaire précédent, mais des résultats reproductibles doit parfois le même environnement (par exemple les paquets installés., Les caractéristiques de la machine et ainsi de suite). Donc, je recommande de copier votre environnement à un autre endroit au cas où vous auriez des résultats reproductibles. Essayez d'utiliser l'une des technologies suivantes:

  1. Docker. Si vous avez un Linux c'est très facile de déplacer votre environnement à un autre endroit. Aussi, vous pouvez essayer d'utiliser DockerHub.
  2. Binder. Ceci est une plate-forme de nuage pour reproduire des expériences scientifiques.
  3. Everware. C'est encore une autre plate-forme cloud pour la "science réutilisable". Voir le project repository sur Github.
+0

Mon problème est que je ne peux pas obtenir de résultats reproductibles même sur le même environnement lorsque je cours deux fois. –

0

J'ai formé et testé Sequential() types de réseaux de neurones en utilisant Keras. J'ai effectué une régression non linéaire sur les données vocales bruyantes. J'ai utilisé le code suivant pour générer des semences au hasard:

import numpy as np 
seed = 7 
np.random.seed(seed) 

Je reçois les mêmes résultats exacts de val_loss chaque fois que je train et test sur les mêmes données.

+1

Avez-vous utilisé le GPU? Quel backend: Theano ou TensorFlow? –

+0

J'ai utilisé le processeur avec le backend Theano. –

+1

J'ai compris. Le processeur fonctionne bien pour moi aussi. J'ai des problèmes uniquement lors de l'exécution sur GPU. –

1

Je voudrais ajouter quelque chose aux réponses précédentes. Si vous utilisez python 3 et que vous voulez obtenir des résultats reproductibles pour chaque course, vous devez

  1. ensemble numpy.random.seed au début de votre code
  2. donner PYTHONHASHSEED = 0 en tant que paramètre l'interpréteur python
+0

Ne marche plus. – Dmitry

6

J'ai finalement obtenu des résultats reproductibles avec mon code. C'est une combinaison de réponses que j'ai vues sur le web. La première chose à faire est ce que dit @alex:

  1. Ensemble numpy.random.seed;
  2. Utilisez PYTHONHASHSEED=0 pour Python 3.

Ensuite, vous devez résoudre le problème noté par @ user2805751 en ce qui concerne cuDNN en appelant votre code Keras avec le THEANO_FLAGS supplémentaire suivant:

  1. dnn.conv.algo_bwd_filter=deterministic,dnn.conv.algo_bwd_data=deterministic

Et enfin, vous devez patcher votre installation Théano selon this comment, qui consiste essentiellement à:

  1. en remplaçant tous les appels à l'opérateur *_dev20 par sa version normale en theano/sandbox/cuda/opt.py.

Cela devrait vous donner les mêmes résultats pour la même graine.

Notez qu'il peut y avoir un ralentissement. J'ai vu une augmentation du temps de fonctionnement d'environ 10%.