Почему этот код не может воспроизвести меня из моего Keras LSTM? - PullRequest
0 голосов
/ 26 сентября 2019

Я пытался использовать различные ресурсы здесь, на StackExchange, и те, которые были предоставлены Keras, для получения воспроизводимых результатов из моего LSTM.В настоящее время я делаю следующее (и не могу) для обеспечения воспроизводимости, в следующем порядке:

  • Я установил PYTHONHASHSEED (с помощью магии, как вы увидите, я работаю в блокноте Jupyter).

  • Я гарантирую, что я использую только процессор, а не графический процессор.

  • Я устанавливаю случайные начальные числа для библиотек python, в которых любая рандомизацияможет быть введен - (numpy, случайный модуль Python, тензор потока).

  • Я заставляю TensorFlow использовать один поток.

  • Хотя вы можетеОбратите внимание, что RandomizedSearchCV и TimeSeriesSplit импортированы в приведенном ниже коде, я не использую их при генерации своих результатов, так как мне пришло в голову, что это может привести к другим ошибкам рандомизации.Вместо этого я провожу один тренинг и один тестовый набор для моих данных, разбитый по жестко закодированным индексам, и тренируюсь только для одной эпохи, чтобы упростить выделение источника этой нежелательной изменчивости.

Установка вышеуказанных элементов управления действительно сузила изменчивость в лучшую сторону, но, несмотря на это, моя val_loss колеблется между 2 значениями и, таким образом, не является действительно воспроизводимой.Я понятия не имею, почему один прогон даст мне одно значение, в то время как следующий прогон даст мне то же значение или другой без рифмы или причины.Может кто-нибудь сказать мне, что я делаю не так, пожалуйста?

%env PYTHONHASHSEED=0

import os
os.environ["CUDA_DEVICE_ORDER"] = "PCI_BUS_ID"
os.environ["CUDA_VISIBLE_DEVICES"] = ""

import numpy as np
import tensorflow as tf
import random as rn

seed = 2

# The below is necessary for starting Numpy generated random numbers
# in a well-defined initial state.

np.random.seed(seed)

# The below is necessary for starting core Python generated random numbers
# in a well-defined state.

rn.seed(seed)

# The below tf.set_random_seed() will make random number generation
# in the TensorFlow backend have a well-defined initial state.
# For further details, see:
# https://www.tensorflow.org/api_docs/python/tf/set_random_seed

tf.set_random_seed(seed)

# Force TensorFlow to use single thread.
# Multiple threads are a potential source of non-reproducible results.
# For further details, see: https://stackoverflow.com/questions/42022950/

session_conf = tf.ConfigProto(intra_op_parallelism_threads=1,
                              inter_op_parallelism_threads=1)

from keras import backend as K

sess = tf.Session(graph=tf.get_default_graph(), config=session_conf)
K.set_session(sess)

# Rest of code follows ..




import pandas as pd, matplotlib.pyplot as plt, scipy.stats
from keras.models import Sequential
from keras.layers import Dense, BatchNormalization, Embedding, LSTM, Dropout
from keras.callbacks import EarlyStopping
from keras.wrappers.scikit_learn import KerasClassifier
from sklearn.model_selection import RandomizedSearchCV, TimeSeriesSplit
from keras.optimizers import Adam
from keras.losses import binary_crossentropy

model = Sequential()
model.add(LSTM(30, input_shape = (sequences.shape[1], sequences.shape[2]), activation = 'relu'))
model.add(BatchNormalization())
model.add(Dense(30, activation = 'relu'))
model.add(BatchNormalization())
model.add(Dense(25, activation = 'relu'))
model.add(BatchNormalization())
model.add(Dense(1, activation = 'sigmoid'))

#compile model
model.compile(optimizer = Adam(lr=.001), loss = binary_crossentropy, metrics=['accuracy'])

1 Ответ

0 голосов
/ 27 сентября 2019

Я предлагаю проверить, содержит ли ваша модель недетерминированные операции.Примечательно, что reduce_sum является одной из таких операций.Эти операции являются недетерминированными, потому что сложение и умножение с плавающей точкой неассоциативны (порядок, в котором числа с плавающей запятой добавляются или умножаются, влияет на результат), и потому что такие операции не гарантируют, что их входы добавляются или умножаются в одном и том же порядке каждый раз,Я не знаю полного списка недетерминированных операций TensorFlow.Чтобы выяснить, какая операция может быть причиной этой проблемы, попробуйте уменьшить количество слоев в модели или изменить, какие слои или операции используются в этой модели, и посмотрите, дает ли это согласованные результаты.Смотри также этот вопрос .

...