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

Posted

技术标签:

【中文标题】从不同版本的 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) 【发布时间】:2021-12-26 20:32:55 【问题描述】:

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

到目前为止我已经尝试过: 类似的讨论展示了如何将模型从 tf 1.15 - 2.1 转换为 tf.10,但是当我尝试此解决方案时,我收到错误“未知层:功能”。链接: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)

链接:ValueError: Unknown layer: Functional

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

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

链接:https://github.com/onnx/tensorflow-onnx 和 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')

【问题讨论】:

【参考方案1】:

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

    根类 Model 现在是 Functional 在 tf-1.15 中添加了对 Ragged 张量 的支持

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

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

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

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

【讨论】:

感谢您的帮助!我厌倦了您的建议并用“模型”替换了“功能”,并从 .json 文件中删除了参差不齐的参数。但是,我收到另一个错误说 可以在编辑前后共享文件的一部分吗?我希望您删除逗号 (,) 和空格以及“参差不齐”的字段,因为我在您分享的错误中看到了前导逗号 (,)。 这里是我编辑的行。还有什么有助于确定问题吗?原文: "class_name": "Functional", "config": "name": "functional_9", "layers": ["class_name": "InputLayer", "config": "batch_input_shape": [null, 224, 224, 3],“dtype”:“float32”,“sparse”:false,“ragged”:false,“name”:“input_5”,新版本:“class_name”:“Model”,“config ": "name": "functional_9", "layers": ["class_name": "InputLayer", "config": "batch_input_shape": [null, 224, 224, 3], "dtype": "float32 ", "稀疏": false, "名称": "input_5", 我觉得不错。我能够通过这两个更改加载我的,但是,它可能会因模型配置而异。如果您希望将 json 文件添加到问题中,那么我可以尝试看看 当然,我在问题中添加了一个谷歌链接以下载原始 .json 文件。我对堆栈溢出很陌生,我找不到更好的附加方法。如果您需要我以其他方式发送它,请告诉我!

以上是关于从不同版本的 tf.keras 加载保存的模型(从 tf 2.3.0 到 tf 1.12)的主要内容,如果未能解决你的问题,请参考以下文章

JSONDecodeError:加载 tf.Keras 模型时的期望值

加载 tf.keras 模型,ValueError: The two structure don't have the same nested structure

从 LSTM 到 Sklearn 模型的特征提取

tensorflow2.0新特性

tf2.0 Keras:使用 RNN 的自定义张量流代码时无法保存权重

tf.keras 如何保存 ModelCheckPoint 对象