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