Не удалось загрузить модель Keras в Keras 2.4.3 (с Tensorflow 2.3.0), которая была сохранена в Keras 2.1.0 (с Tensorflow 1.3.0)

#python #machine-learning #keras #neural-network #batch-normalization

#python #машинное обучение #keras #нейронная сеть #пакетное нормирование

Вопрос:

Я реализую модель Keras с пользовательским уровнем пакетной перенормировки, который имеет 4 веса (бета, гамма, running_mean и running_std) и 3 переменные состояния (r_max, d_max и t):

     self.gamma = self.add_weight(shape = shape, #NK - shape = shape
                                 initializer=self.gamma_init,
                                 regularizer=self.gamma_regularizer,
                                 name='{}_gamma'.format(self.name))
    self.beta = self.add_weight(shape = shape, #NK - shape = shape
                                initializer=self.beta_init,
                                regularizer=self.beta_regularizer,
                                name='{}_beta'.format(self.name))
    self.running_mean = self.add_weight(shape = shape, #NK - shape = shape
                                        initializer='zero',
                                        name='{}_running_mean'.format(self.name),
                                        trainable=False)
    # Note: running_std actually holds the running variance, not the running std.
    self.running_std = self.add_weight(shape = shape, initializer='one',
                                       name='{}_running_std'.format(self.name),
                                       trainable=False)
    self.r_max = K.variable(np.ones((1,)), name='{}_r_max'.format(self.name))

    self.d_max = K.variable(np.zeros((1,)), name='{}_d_max'.format(self.name))

    self.t = K.variable(np.zeros((1,)), name='{}_t'.format(self.name))
  

Когда я проверяю модель, сохраняются только гамма, бета, running_mean и running_std (как и ожидалось), но когда я пытаюсь загрузить модель, я получаю эту ошибку:

 Layer #1 (named "batch_renormalization_1" in the current model) was found to correspond to layer batch_renormalization_1 in the save file. However the new layer batch_renormalization_1 expects 7 weights, but the saved weights have 4 elements. 
  

Похоже, что модель ожидает, что все 7 весов будут частью сохраненного файла, даже если некоторые из них являются переменными состояния.

Есть идеи относительно того, как обойти это?

РЕДАКТИРОВАТЬ: я понимаю, что проблема заключалась в том, что модель была обучена и сохранена в Keras 2.1.0 (с серверной частью Tensorflow 1.3.0), и я получаю ошибку только при загрузке модели с использованием Keras 2.4.3 (с серверной частью Tensorflow 2.3.0). Я могу загрузить модель с помощью Keras до версии 2.1.0.

Итак, реальный вопрос в том, что изменилось в Keras / Tensorflow, и есть ли способ загрузить старые модели без получения этой ошибки?

Ответ №1:

Вы не можете не загружать модель таким образом, потому что keras.models.load_model загрузит конфигурацию, которая была определена, а не что-то было self_customed.

Чтобы преодолеть это, вам следует перезагрузить архитектуру модели и попытаться вместо этого загрузить из нее load_weights:

 model = YourModelDeclaration()
model.load_weights("checkpoint/h5file")
  

У меня такая же проблема, когда я самостоятельно настраиваю BatchNormalize, поэтому я был бы уверен, что это единственный способ ее загрузить.

Комментарии:

1. Спасибо за ваш ответ, но load_weights тоже не работает. После некоторого изучения я обнаружил, что ошибка на самом деле вызвана сохранением, а затем попыткой загрузки в разных версиях Keras / Tensorflow. Итак, реальный вопрос заключается в том, есть ли способ загрузить модели, сохраненные в более старых версиях Keras, не сталкиваясь с этой ошибкой.

2. Очевидно, что вы не должны сохранять веса только в другой версии, а затем загружать ее в более новой. Но странно, что даже сохранение всей модели не может избавить вас от перемещения вперед и назад: D

3. Похоже, что это может быть распространенной проблемой. В этом случае я пытаюсь использовать модель, созданную кем-то другим, и они не предоставили подробной информации о том, какую версию Tensorflow / Keras они использовали. Поэтому потребовалось немного угадать и проверить, чтобы все заработало. Мне кажется, что загрузка модели должна работать в разных версиях, иначе совместное использование моделей будет очень затруднено.

Ответ №2:

В Keras есть два способа сохранить состояние вашей модели.

Вы можете вызвать функции model.save() и model.save_weights() .

model.save() сохраняет всю модель, включая веса и градиенты. В вашем случае 4 веса и 3 переменные состояния будут сохранены этим методом. Вы можете просто использовать load_model("path.h5") метод, чтобы вернуть свою модель обратно.

model.save_weights() Функция сохраняет только веса модели и вообще не сохраняет структуру. Здесь важно отметить, что обратный вызов Keras checkpoint использует model.save_weights() метод под капотом. Если вы хотите использовать веса контрольных точек, вы должны создать экземпляр своей структуры модели model = customModel() , а затем загрузить в нее веса model.load_weights("checkpoint.h5")

Комментарии:

1. Спасибо за ваш ответ, но load_weights тоже не работает. После некоторого изучения я обнаружил, что ошибка на самом деле вызвана сохранением, а затем попыткой загрузки в разных версиях Keras / Tensorflow. Итак, реальный вопрос заключается в том, есть ли способ загрузить модели, сохраненные в более старых версиях Keras, не сталкиваясь с этой ошибкой.

2. Насколько я понимаю, вы не можете перемещаться между версиями Keras / tf при сохранении и загрузке моделей.