Я тренирую простой автоэнкодер в Керасе с данными, которые я сгенерировал. В настоящее время я запускаю код в записной книжке 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 вопрос. Большое спасибо!