keras multi_gpu_model saved_model не удалось загрузить модель в коде TF2

#tensorflow #keras #tensorflow2.0

#tensorflow #keras #tensorflow2.0

Вопрос:

Я обучил multi_gpu_model с использованием tensorflow 1.13 / 1.14 и сохранил их с помощью keras.model.save(‘<.hdf5>’). Теперь, после перехода на tensorflow 2.4.1, в который Keras интегрирован как tensorflow.keras, я не могу tensorflow.keras.models.load_model, как я делал раньше, из-за следующей ошибки:

 AttributeError: module 'tensorflow.python.keras.backend' has no attribute 'slice'
 

После попытки импортировать keras.models.load_model и попробовать разные версии keras (2.2.4 -> 2.4.1) и tensorflow (2.2 -> 2.4.1) я не могу загрузить модель из моего файла .hdf5, используя мой код TF 2.2 .

Я знаю, что в TF 2.X мы можем обучаться с использованием распределенных машин, реализуя область действия «стратегия», и это действительно работает, но у меня много «старых» моделей, которые мне нужно работать с той же кодовой базой, которая сейчас переносится на TF 2.4.1

Ответ №1:

По-видимому, проблема заключалась не в версиях TF, а в том, как я сохранял свои модели в своих версиях кода TF 1.X .

Я использовал keras.multi_gpu_model класс как для обучения, так и для сохранения, хотя эта практика неверна, как четко указано в документации Keras:

«Чтобы сохранить модель с несколькими графическими процессорами, используйте .save(fname) или .save_weights(fname) с шаблонной моделью (аргумент, который вы передали multi_gpu_model ), а не с моделью, возвращенной multi_gpu_model » .

Итак, после выяснения этого был принят метод преобразования модели с использованием кода TF 1.X:

  1. создайте модель с нуля, а именно new_model
  2. загрузите предварительно подготовленные веса из multi_gpu_model, а именно ‘old_model’
  3. скопируйте ваши old_model веса, которые old_model.layers[3] (из-за неправильного использования multi_gpu_model) в ваш new_model
  4. сохранить new_model как файл .hdf5
  5. используйте new_model .hdf5 везде — TF 1.X и TF 2.X