【问题标题】:keras multi_gpu_model saved_model failed to load model in TF2 codekeras multi_gpu_model saved_model 无法在 TF2 代码中加载模型
【发布时间】:2021-04-14 18:49:49
【问题描述】:

我已经使用 tensorflow 1.13/1.14 训练了一个 multi_gpu_model,并使用 keras.model.save('<.hdf5>') 保存了它们。 现在,在迁移到将 Keras 集成为 tensorflow.keras 的 tensorflow 2.4.1 后,由于以下错误,我无法像以前那样使用 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 的代码库

【问题讨论】:

    标签: tensorflow keras tensorflow2.0


    【解决方案1】:

    显然问题不在于 TF 版本,而是我在 TF 1.X 代码版本上保存模型的方式。

    我使用keras.multi_gpu_model 类进行训练和保存,虽然这种做法是错误的,正如 Keras 文档中明确指出的那样:

    "要保存多gpu模型,请使用.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

    【讨论】:

      猜你喜欢
      • 2021-11-30
      • 2018-04-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多