keras не загружает модель и вес при использовании контрольной точки

Я использую keras для создания глубокого автоэнкодера. Я использовал его контрольную точку для загрузки модели и весов, но результат всегда None, что, я думаю, означает, что контрольная точка работает неправильно и не сохраняет веса. Вот код, как я поступаю:

checkpointer = ModelCheckpoint(filepath="weights.best.h5",
                               verbose=0,
                               save_best_only=True)
tensorboard = TensorBoard(log_dir='/tmp/autoencoder',
                          histogram_freq=0,
                          write_graph=True,
                          write_images=True)
input_enc = Input(shape=(input_size,))
hidden_1 = Dense(hidden_size1, activation='relu')(input_enc)
hidden_11 = Dense(hidden_size2, activation='relu')(hidden_1)
code = Dense(code_size, activation='relu')(hidden_11)
hidden_22 = Dense(hidden_size2, activation='relu')(code)
hidden_2 = Dense(hidden_size1, activation='relu')(hidden_22)
output_enc = Dense(input_size, activation='tanh')(hidden_2)
autoencoder_yes = Model(input_enc, output_enc)

autoencoder_yes.compile(optimizer='adam',
                         loss='mean_squared_error', 
                         metrics=['accuracy'])
history_yes = autoencoder_yes.fit(df_noyau_norm_y, df_noyau_norm_y,
                               epochs=200,
                                batch_size=batch_size,
                                shuffle = True,
                                validation_data=(df_test_norm_y, df_test_norm_y),
                                verbose=1, 
                                callbacks=[checkpointer, tensorboard]).history

autoencoder_yes.save_weights("weights.best.h5")
print(autoencoder_yes.load_weights("weights.best.h5"))

Может ли кто-нибудь помочь мне найти способ решить проблему? Спасибо


person Mari    schedule 28.03.2018    source источник


Ответы (3)


вы должны использовать save_weights_only=True. Без этого сохраняется вся модель, а не только веса. Чтобы иметь возможность загружать веса, вы должны сохранять веса следующим образом:

checkpointer = ModelCheckpoint(filepath="weights.best.h5",
                           verbose=0, save_weights_only=True,
                           save_best_only=True)
person Ioannis Nasios    schedule 28.03.2018

Нет, ваша интерпретация load_weights возврата None неверна. Загрузка весов — это процедура, она ничего не возвращает, и если вы присвоите возвращаемое значение процедуры переменной, она получит значение None.

Так что снижение веса, вероятно, работает нормально, просто ваша интерпретация неверна.

person Dr. Snoopy    schedule 28.03.2018
comment
Итак, как я могу получить доступ к файлу, содержащему веса, и повторно использовать его в другой раз?? И я хочу знать: правильно ли сохранены веса, нужно ли сохранять скрипт процесса обучения автоэнкодера, потому что я работаю в одном и том же файле и не хочу, чтобы при каждом запуске скрипта запускался автоэнкодер опять тренировки?? - person Mari; 28.03.2018
comment
@Mari Вы просто используете load_model для загрузки модели и весов из файла .hdf5. - person Dr. Snoopy; 28.03.2018

Это ожидаемое поведение, а не ошибка. На самом деле autoencoder_yes.load_weights("weights.best.h5") ничего не возвращает, поэтому, если вы попытаетесь распечатать вывод этой функции, вы получите None в качестве вывода.

Ожидаемое поведение

В предоставленном вами коде вы обучили модель и сохранили веса. Итак, autoencoder_yes — это объект keras.Model с точно настроенными весами.

В том же скрипте, если вы снова загрузите сохраненные веса, ничего не должно произойти, веса, которые вы сохранили, будут загружены снова.

Для ясности

Начните с другого свежего скрипта, постройте ту же архитектуру модели и перезагрузите веса из файла h5, а затем сделайте несколько прогнозов. В этом случае он будет молча загружать предварительно обученные веса и делать прогнозы в соответствии с этим.

person Vivek Kalyanarangan    schedule 28.03.2018
comment
Итак, как я могу получить доступ к файлу, содержащему веса, и повторно использовать его в другой раз?? И я хочу знать: правильно ли сохранены веса, нужно ли сохранять скрипт процесса обучения автоэнкодера, потому что я работаю в одном и том же файле и не хочу, чтобы при каждом запуске скрипта запускался автоэнкодер опять тренировки?? - person Mari; 28.03.2018
comment
Нет, вам вообще не нужен сценарий обучения. В отдельном скрипте (обычно тестовом скрипте или прогнозном скрипте) просто не fit модель, сделайте все, что вы сделали, и загрузите веса прямо из файла h5 вместо вызова функции fit - person Vivek Kalyanarangan; 29.03.2018
comment
Я понимаю, это. Но теперь проблема в том, что когда я загружаю веса, чтобы получить слой закодированных данных (поскольку я работаю над автоэнкодером), чтобы выполнить над ним некоторые операции, я каждый раз получаю разные результаты, что, я думаю, означает, что веса не фиксированы. и правильно сохранил! Есть ли у вас какое-либо объяснение и решение для этого? - person Mari; 29.03.2018