Как сбросить модель тензорного потока, чтобы я мог тренироваться несколько раз

#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.

Как мне сбросить свою модель несколько раз, каждый раз получая одинаковую инициализацию веса?