Подтвердить что ты не робот

Как получить воспроизводимые результаты в керасе

Я получаю разные результаты (точность теста) каждый раз, когда я запускаю пример imdb_lstm.py из рамки Keras (https://github.com/fchollet/keras/blob/master/examples/imdb_lstm.py) Код содержит np.random.seed(1337) в верхней части, перед тем, как импортировать keras. Он должен помешать ему генерировать разные номера для каждого запуска. Что мне не хватает?

ОБНОВЛЕНИЕ: как воспроизвести:

  • Установите Keras (http://keras.io/)
  • Выполните https://github.com/fchollet/keras/blob/master/examples/imdb_lstm.py несколько раз. Он будет обучать модель и выводить точность тестирования.
    Ожидаемый результат: точность тестирования одинакова для каждого запуска.
    Фактический результат: точность тестирования при каждом прогоне различна.

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)

4b9b3361

Ответ 1

Вы можете найти ответ в документации Keras: https://keras.io/getting-started/faq/#how-can-i-obtain-reproducible-results-using-keras-during-development.

Короче говоря, чтобы быть абсолютно уверенным в том, что вы получите воспроизводимые результаты с вашим скриптом Python на процессоре одного компьютера/ноутбука, вам нужно будет сделать следующее:

  1. Установите переменную среды PYTHONHASHSEED на фиксированное значение
  2. Установите для встроенного псевдослучайного генератора python фиксированное значение
  3. Установите псевдослучайный генератор numpy на фиксированное значение
  4. Установите псевдослучайный генератор tensorflow на фиксированное значение
  5. Настройте новый глобальный сеанс 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:

  1. Установите numpy.random.seed;
  2. Используйте PYTHONHASHSEED=0 для Python 3.

Затем вы должны решить проблему, отмеченную @user2805751 в отношении cuDNN, вызвав свой код THEANO_FLAGS с помощью следующих дополнительных THEANO_FLAGS:

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

И, наконец, вы должны исправить вашу установку Theano согласно этому комментарию, который в основном состоит из:

  1. замена всех вызовов оператора *_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