Невозможно воспроизвести результаты с Tensorflow даже со случайным начальным числом - PullRequest
0 голосов
/ 20 апреля 2020

Я тренирую простой автоэнкодер в Керасе с данными, которые я сгенерировал. В настоящее время я запускаю код в записной книжке Google Colab (если есть небольшая вероятность того, что это может иметь значение). Чтобы достичь воспроизводимых результатов, я в настоящее время устанавливаю случайные начальные числа, как я показал ниже, но это, кажется, не полностью эффективно:

# Choose random seed value 
seed_value = 0

# Set numpy pseudo-random generator at a fixed value
np.random.seed(seed_value)

# Set tensorflow pseudo-random generator at a fixed value
import tensorflow as tf
tf.random.set_seed(seed_value)

Кажется, что случайный начальный код помогает получать одинаковые начальные веса каждый раз раз я инициализирую модель. Я вижу это, используя model.get_weights() после создания модели (это имеет место даже тогда, когда я перезагружаю ноутбук и перезапускаю код). Однако я не могу достичь воспроизводимых результатов с точки зрения производительности модели, потому что вес модели меняется каждый раз после тренировки. Я предполагаю, что приведенный выше случайный начальный код учитывает, что данные разбиваются и перетасовываются одинаково каждый раз во время обучения, даже если я не разбивал данные обучения / проверки заранее (вместо этого я использую validation_split=0.2) или указал shuffle=False во время подгонки модели, но, может быть, я ошибся в этом предположении? Кроме того, есть ли какие-то другие случайные семена, которые мне нужно включить, чтобы обеспечить воспроизводимые результаты? Вот код, который я использую для построения и обучения модели:

def construct_autoencoder(input_dim, encoded_dim):
   # Add input
   input = Input(shape=(input_dim,))

   # Add encoder layer
   encoder = Dense(encoded_dim, activation='relu')(input)

   # Add decoder layer
   # Input contains binary values, hence the sigmoid activation
   decoder = Dense(input_dim, activation='sigmoid')(encoder)
   model = Model(inputs=input, outputs=decoder)

   return model

autoencoder = construct_autoencoder(10, 6)
autoencoder.compile(optimizer='adam', loss='binary_crossentropy')
# print(autoencoder.get_weights()) -> This is the same every time, even with restarting the notebook

autoencoder.fit([data,
                 data, 
                 epochs=20, 
                 validation_split=0.2,
                 batch_size=16,
                 verbose=0)

# print(autoencoder.get_weights()) -> This is different every time, but not sure why?

Если у вас есть идеи, почему я не получаю воспроизводимых результатов во время обучения модели, сообщите мне. Я нашел это https://keras.io/getting-started/faq/#how -can-i-получить-воспроизводимые результаты-используя-keras-в-процессе-разработки на веб-сайте Keras, но не уверен, имеет ли это значение (и если да, то почему? ). Я знаю, что есть другие вопросы о воспроизводимости для модельного обучения, но я не нашел ни одного из них, чтобы ответить на этот конкретный c вопрос. Большое спасибо!

1 Ответ

0 голосов
/ 20 апреля 2020

В дополнение к настройке семян и рекомендаций в статье Keras (они действительно актуальны), вам необходимо убедиться, что все ваши версии модулей python такие же, как в ноутбуке.

Проверка версий всех ваших модулей локально может быть легко выполнена с помощью команды pip freeze (в интерфейсе командной строки). Проверка в блокноте может быть выполнена для каждого модуля, например:

import tensorflow as tf
print(tf.__version__)
...