Как получить воспроизводимые результаты в керасе
Я получаю разные результаты (точность теста) каждый раз, когда я запускаю пример imdb_lstm.py
из рамки Keras (https://github.com/fchollet/keras/blob/master/examples/imdb_lstm.py)
Код содержит np.random.seed(1337)
в верхней части, перед тем, как импортировать keras. Он должен помешать ему генерировать разные номера для каждого запуска. Что мне не хватает?
ОБНОВЛЕНИЕ: как воспроизвести:
UPDATE2: Я запускаю его в Windows 8.1 с помощью MinGW/msys, версии модулей:
theano 0.7.0
numpy 1.8.1
scipy 0.14.0c1
UPDATE3: Я немного сузил проблему. Если я запустил пример с помощью GPU (установите флаг anano device = gpu0), то каждый раз получаю различную точность теста, но если я запустил его на CPU, тогда все будет работать так, как ожидалось. Моя видеокарта: NVIDIA GeForce GT 635)
Ответы
Ответ 1
Вы можете найти ответ в документации Keras: https://keras.io/getting-started/faq/#how-can-i-obtain-reproducible-results-using-keras-during-development.
Короче говоря, чтобы быть абсолютно уверенным в том, что вы получите воспроизводимые результаты с вашим скриптом Python на процессоре одного компьютера/ноутбука, вам нужно будет сделать следующее:
- Установите переменную среды
PYTHONHASHSEED
на фиксированное значение
- Установите для встроенного псевдослучайного генератора
python
фиксированное значение
- Установите псевдослучайный генератор
numpy
на фиксированное значение
- Установите псевдослучайный генератор
tensorflow
на фиксированное значение
- Настройте новый глобальный сеанс
tensorflow
Следуя ссылке Keras
вверху, я использую следующий исходный код:
# Seed value
# Apparently you may use different seed values at each stage
seed_value= 0
# 1. Set the 'PYTHONHASHSEED' environment variable at a fixed value
import os
os.environ['PYTHONHASHSEED']=str(seed_value)
# 2. Set the 'python' built-in pseudo-random generator at a fixed value
import random
random.seed(seed_value)
# 3. Set the 'numpy' pseudo-random generator at a fixed value
import numpy as np
np.random.seed(seed_value)
# 4. Set the '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)
Нет необходимости говорить, что вам не нужно указывать какие-либо seed
или random_state
в функциях numpy
, scikit-learn
или tensorflow
/keras
, которые вы используете в своем скрипте Python именно потому, что с исходным кодом выше мы устанавливаем глобально их псевдослучайные генераторы на фиксированное значение.
Ответ 2
Theano документация рассказывает о трудностях посева случайных переменных и почему они высевают каждый экземпляр графа с помощью своего генератора случайных чисел.
Обмен генератором случайных чисел между различными {{{RandomOp}}} экземпляры затрудняют создание одного и того же других ops в графе и сохранить {{{RandomOps}}} изолированный. Поэтому каждый экземпляр {{RandomOp}}} на графике будет иметь собственный генератор случайных чисел. Этот генератор случайных чисел является входом к функции. В типичном использовании мы будем использовать новые функции ({{{value}}}, {{{update}}}) для передачи и обновления rng для каждого {{{RandomOp}}}. Путем передачи RNG в качестве входных данных можно использовать обычные методы доступа к входам функций для доступа к каждому {{{RandomOp}}} s rng. В этом подходе нет уже существующих механизм работы с объединенным состоянием случайных чисел целого граф. Поэтому предложение заключается в предоставлении недостающей функциональности ( последние три требования) через вспомогательные функции: {{{seed, getstate, SetState}}}.
Они также предоставляют examples о том, как засеять все генераторы случайных чисел.
Вы также можете засеять все случайные величины, Объект RandomStreams этим методом семени объектов. Это семя будет используется для засеивания временного генератора случайных чисел, что в свою очередь генерировать семена для каждой из случайных величин.
>>> srng.seed(902340) # seeds rv_u and rv_n with different seeds each
Ответ 3
Я наконец получил воспроизводимые результаты с моим кодом. Это комбинация ответов, которые я видел в Интернете. Первое, что нужно сделать, что говорит @alex:
- Установите
numpy.random.seed
; - Используйте
PYTHONHASHSEED=0
для Python 3.
Затем вы должны решить проблему, отмеченную @user2805751 в отношении cuDNN, вызвав свой код THEANO_FLAGS
с помощью следующих дополнительных THEANO_FLAGS
:
-
dnn.conv.algo_bwd_filter=deterministic,dnn.conv.algo_bwd_data=deterministic
И, наконец, вы должны исправить вашу установку Theano согласно этому комментарию, который в основном состоит из:
- замена всех вызовов оператора
*_dev20
его обычной версией в theano/sandbox/cuda/opt.py
Это должно дать вам те же результаты для того же семени.
Обратите внимание, что может быть замедление. Я видел увеличение времени работы примерно на 10%.
Ответ 4
Я тренировал и тестировал Sequential()
виды нейронных сетей, использующих Keras. Я выполнял нелинейную регрессию на шумных речевых данных. Я использовал следующий код для генерации случайных семян:
import numpy as np
seed = 7
np.random.seed(seed)
Я получаю точные результаты val_loss
каждый раз, когда я тренируюсь и тестирую те же данные.
Ответ 5
Я хотел бы добавить что-то к предыдущим ответам. Если вы используете python 3 и хотите получить воспроизводимые результаты для каждого прогона, вы должны
- установите numpy.random.seed в начале вашего кода.
- дать PYTHONHASHSEED = 0 в качестве параметра интерпретатору python
Ответ 6
Это работает для меня:
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)
Ответ 7
Я согласен с предыдущим комментарием, но воспроизводимые результаты иногда нуждаются в той же среде (например, установленные пакеты, характеристики машины и т.д.). Поэтому я рекомендую скопировать среду в другое место, чтобы иметь воспроизводимые результаты. Попробуйте использовать одну из следующих технологий:
- Docker. Если у вас есть Linux, это очень легко перемещать вашу среду в другое место. Также вы можете попробовать использовать DockerHub.
- Binder. Это облачная платформа для воспроизведения научных экспериментов.
- Everware. Это еще одна облачная платформа для "многоразовой науки". См. репозиторий проектов в Github.
Ответ 8
Наилучшее решение, которое на сегодняшний день работает с графическим процессором, это установить тензор потока-детерминизма со следующим:
pip install tensorflow-determinism
Затем добавьте следующий код в свой код
import tensorflow as tf
import os
os.environ['TF_DETERMINISTIC_OPS'] = '1'
источник: https://github.com/NVIDIA/tensorflow-determinism