从不同版本的 tf.keras 加载保存的模型(从 tf 2.3.0 到 tf 1.12)

Loading the saved models from tf.keras in different versions (From tf 2.3.0 to tf 1.12)

问题: 我在 tf 2.3.0 中创建并训练了一个 keras 模型,我需要在 tf 1.12.0 中加载这个模型,以便与需要旧版本 tf 的库一起使用。有什么方法可以将模型从新版本的 tf 格式转换为旧版本,以便我可以使用 tf 1.12.0 加载模型?

到目前为止我尝试过的: 类似的讨论展示了如何将模型从 tf 1.15 - 2.1 转换为 tf.10,但是当我尝试这个解决方案时,我收到错误“Unknown layer: functional”。 Link: Loading the saved models from tf.keras in different versions

我尝试使用另一个问题建议的以下行来解决此问题:

new_model = tf.keras.models.model_from_json(json_config, custom_objects {'Functional':tf.keras.models.Model})

Link:

但是,如果我使用这个,我会得到一个错误: ('Unrecognized keyword arguments:', dict_keys(['ragged'])) ,这与第一次讨论中讨论的错误相同我在上面链接了。

我尝试的另一种方法是使用 Onnx 库将 keras 模型转换为 Onnx 模型,然后再转换回不同版本的 keras 模型。然而,我很快意识到 keras2onnx 库需要 tf 2.x.

Links: https://github.com/onnx/tensorflow-onnx and https://github.com/gmalivenko/onnx2keras

任何关于如何解决这个问题而不必在旧版本的 tensorflow 中重新训练我的模型的建议将不胜感激!谢谢

这是我尝试实现的加载模型的简单代码:

保存在 tf 2.3.0

import tensorflow as tf

CNN_model=tf.keras.models.load_model('Real_Image_XAI_Models/Test_10_DC_R_Image.h5')

CNN_model.save_weights("Real_Image_XAI_Models/weights_only.h5")

json_config = CNN_model.to_json()

with open('Real_Image_XAI_Models/model_config.json', 'w') as json_file:
    json_file.write(json_config)

加载 tf 1.12.0

with open('Real_Image_XAI_Models/model_config.json') as json_file:
    json_config = json_file.read()

new_model = tf.keras.models.model_from_json(json_config)

#or implement the line to acount for the functional class

#new_model = tf.keras.models.model_from_json(json_config, custom_objects={'Functional':tf.keras.models.Model})

new_model.load_weights('Real_Image_XAI_Models/weights_only.h5')

从 tf-1.12.0 到 tf-2.3.0 的模型配置有重大变化,包括但不限于以下内容:

  1. root class Model 现在是 Functional
  2. 在 tf-1.15
  3. 中添加了对 Ragged 张量 的支持

您可以尝试编辑从 tf-2.3.0 保存的模型配置 json 文件,以反转这些更改的影响,如下所示:

  1. 将根 class 定义 "class_name": "Functional" 替换为 "class_name": "Model"。这将逆转上面更改 #1 的效果。
  2. 删除所有出现的 "ragged": false, (以及 "ragged": true, ,如果存在的话)。这将逆转上面更改 #2 的效果。

注意 尾随逗号和 space 以及上面的“参差不齐”的字段

您可能会尝试找到一种在 json 字典中或在模型加载时以编程方式进行这些更改的方法,但我发现对 json 文件本身。