将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
相关产品推荐
相关产品推荐

