从不同版本的 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