You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

将Hvass-Labs迁移学习代码转Keras后保存模型遇序列化错误

解决Keras迁移学习模型保存时的Dimension序列化错误

这个问题我之前也碰到过!核心原因是你的模型里用到了TensorFlow原生的Dimension对象(比如定义输入层时用了TF的维度类型而非纯整数),而Keras的模型JSON序列化器默认没法处理这种TensorFlow专属类型,直接导致保存失败。

下面给你几个可行的解决方案:

方案1:把输入层维度改成纯整数定义

先检查你接收Inception迁移值的输入层代码,如果之前是类似这样写的:

input_layer = tf.keras.layers.Input(shape=tf.TensorShape([2048]))

或者

input_layer = tf.keras.layers.Input(shape=Dimension(2048))

直接改成用纯整数元组/列表定义维度:

input_layer = tf.keras.layers.Input(shape=(2048,))

这样输入层的维度会用Keras内部的标准表示,而非TensorFlow的Dimension对象,序列化时就不会触发报错了。

方案2:自定义JSON序列化器处理Dimension对象

如果因为某些场景必须保留Dimension对象,可以自定义一个JSON编码器来转换它:

import json
from tensorflow.python.framework.tensor_shape import Dimension

class CustomJSONEncoder(json.JSONEncoder):
    def default(self, obj):
        if isinstance(obj, Dimension):
            return obj.value
        return super().default(obj)

# 保存模型架构时指定自定义编码器
model_json = model.to_json(cls=CustomJSONEncoder)
with open("model.json", "w") as json_file:
    json_file.write(model_json)

这样序列化时Dimension对象会被自动转换成对应的数值,就能正常保存了。

方案3:改用SavedModel格式保存完整模型

要是不想纠结JSON序列化的问题,直接用Keras官方推荐的SavedModel格式保存整个模型,这种格式会完整保存模型结构和权重,完全绕开JSON序列化的坑:

model.save("my_transfer_learning_model")

后续加载模型时用:

loaded_model = tf.keras.models.load_model("my_transfer_learning_model")

这个方法最省心,适合大多数场景。

另外提个小建议:如果你的模型是混合使用TensorFlow原生API和Keras API开发的,尽量统一用Keras的标准API来定义层和维度,能避免不少这类兼容性问题。

内容的提问来源于stack exchange,提问作者Offpics

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 04:31:38