#python #tensorflow #machine-learning #keras #deep-learning
Вопрос:
Я пытаюсь найти оптимальные гиперпараметры, обучая модель несколько раз.
Я создал довольно простую модель:
tf.random.set_seed(42)
os.environ['PYTHONHASHSEED']=str(42)
np.random.seed(42)
def model(input_shape):
""" Deep Learning Model for Binary Output """
input_layer = Input(shape=input_shape)
x = Dense(256, activation="relu")(input_layer)
x = Dropout(0.0)(x)
x = Dense(256, activation="relu")(x)
x = Dropout(0.0)(x)
x = Dense(1, activation="sigmoid")(x)
func_model = Model(inputs=input_layer, outputs=x)
return func_model
(Примечание: позже я заменю значения переменными)
Сначала я использую обратный вызов, чтобы найти оптимальную скорость обучения.
model = model(input_shape)
model.summary()
# Learning Rate Scheduler - Increases learning rate with epoch number so we can find the highest learning rate that converges
lr_schedule = tf.keras.callbacks.LearningRateScheduler(lambda epoch: 1e-8 * 10**(epoch / 20))
model.compile(optimizer="adam", loss="binary_crossentropy", metrics=["accuracy"])
model.save_weights('initial_weights.h5') # save initial weights so we can reset the model later
history = model.fit(train_x, train_y, epochs=150, batch_size=32, validation_data=(test_x, test_y), callbacks=[lr_schedule])
Как указано в комментарии, скорость обучения увеличивается с каждой эпохой. Я строю график зависимости скорости обучения от потерь, чтобы видеть самую высокую стабильную скорость обучения. Я обнаружил, что это 1e-4.
Затем я хочу сбросить свою модель и снова начать использовать эту скорость обучения, продолжая изучать лучшие гиперпараметры для плотных узлов, количества слоев, значения отсева и т. Д.
Проблема в том, что во 2-й раз, когда я тренирую модель, она выходит совсем другой. (На самом деле я еще не включил свою оптимальную скорость обучения, я просто пытаюсь убедиться, что при обучении все остается прежним.)
# tf.keras.backend.clear_session()
# tf.random.set_seed(42)
# model = model(input_shape)
model.load_weights('initial_weights.h5')
history = model.fit(train_x, train_y, epochs=100, batch_size=32, validation_data=(test_x, test_y))
Я перепробовал множество вещей (некоторые из них прокомментированы в приведенном выше блоке кода), таких как tf.keras.backend.clear_session()
, а также сохранение весов перед первой тренировкой, а затем загрузка этих начальных весов позже.
Я ожидаю увидеть примерно одинаковую потерю при тренировках оба раза, но вместо этого я получаю странное поведение. Первая модель тренируется нормально, но после попытки сброса 2-я модель делает странные вещи, такие как потеря, которая вообще не улучшается, или потеря улучшается, но точность остается около 50%. Или потеря составляет 2,54 на первой модели и снижается примерно до 0,5, но при повторной загрузке начальных весов и повторной тренировке потеря начинается с 256,34.
Как мне сбросить свою модель несколько раз, каждый раз получая одинаковую инициализацию веса?