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

Я реализую модель 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, и есть ли способ загрузить более старые модели без получения этой ошибки?


person Nick Koprowicz    schedule 05.09.2020    source источник


Ответы (2)


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

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

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

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

person dtlam26    schedule 09.09.2020
comment
Спасибо за ответ, но load_weights тоже не работает. Покопавшись, я обнаружил, что ошибка на самом деле вызвана сохранением, а затем попыткой загрузки в разных версиях Keras / Tensorflow. Поэтому реальный вопрос заключается в том, есть ли способ загрузить модели, сохраненные в более старых версиях Keras, без этой ошибки. - person Nick Koprowicz; 10.09.2020
comment
Очевидно, что не следует сохранять веса только в другой версии, а затем загружать ее в более новую. Но странно, что даже сохранение всей модели не спасает от движения вперед и назад: D - person dtlam26; 11.09.2020
comment
Похоже, это обычная проблема. В этом случае я пытаюсь использовать модель, созданную кем-то другим, и они не предоставили подробную информацию о том, какую версию Tensorflow / Keras они использовали. Так что потребовалось немного догадаться и проверить, чтобы все заработало. Мне кажется, что загрузка модели должна работать в разных версиях, иначе будет очень сложно делиться моделями. - person Nick Koprowicz; 11.09.2020

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

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

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

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

person Vaibhav Mehrotra    schedule 10.09.2020
comment
Спасибо за ответ, но load_weights тоже не работает. Покопавшись, я обнаружил, что ошибка на самом деле вызвана сохранением, а затем попыткой загрузки в разных версиях Keras / Tensorflow. Поэтому реальный вопрос заключается в том, есть ли способ загрузить модели, сохраненные в более старых версиях Keras, без этой ошибки. - person Nick Koprowicz; 10.09.2020
comment
Насколько я понимаю, вы не можете перемещаться между версиями Keras / tf при сохранении и загрузке моделей. - person Vaibhav Mehrotra; 15.09.2020