TensorFlow移除预训练模型顶层N层后保存为新模型报错如何解决?
TensorFlow裁剪EfficientNet模型后保存失败解决方案
报错核心原因
直接通过原模型输入和指定层输出切片得到的新Model实例,未正确持有原模型中部分状态层的资源引用,序列化时TensorFlow无法定位到函数依赖的变量,属于Keras函数式模型切片后的常见序列化问题。
可用解决方法
- 方法1:重建结构迁移权重(兼容性最高)
先初始化和原微调模型参数完全一致的EfficientNetB0结构,裁剪到对应层后手动迁移权重,再保存:
import tensorflow as tf from tensorflow.keras.applications import EfficientNetB0 from tensorflow.keras.models import Model # 加载已微调的原模型 reconstructed_model = tf.keras.models.load_model(model_path) # 初始化结构和原模型完全对齐的基础模型,参数要和你训练时的配置完全一致 base_model = EfficientNetB0( input_shape=reconstructed_model.input_shape[1:], # 自动对齐原模型输入尺寸 include_top=False, weights=None ) # 裁剪到倒数第4层输出 embedding_new = Model(base_model.input, base_model.layers[-4].output) # 逐层迁移权重 for idx in range(len(embedding_new.layers)): embedding_new.layers[idx].set_weights(reconstructed_model.layers[idx].get_weights()) # 保存新模型 embedding_new.save("your_save_path")
- 方法2:初始化计算图后保存
无需重建结构,切片得到模型后先过一次测试输入完成计算图初始化,再保存:
# 构造和输入shape一致的测试张量,batch维度设为1即可 test_input = tf.random.normal((1, ) + reconstructed_model.input_shape[1:]) # 前向推理一次,完成计算图初始化 _ = embedding(test_input) # 保存模型 embedding.save("your_save_path")
- 方法3:关闭训练跟踪后保存
切换模型到推理模式,添加save_traces=False参数跳过不必要的函数跟踪:
embedding.trainable = False test_input = tf.random.normal((1, ) + reconstructed_model.input_shape[1:]) _ = embedding(test_input) # 2.4及以上版本TensorFlow支持save_traces参数 embedding.save("your_save_path", save_traces=False)
内容的提问来源于stack exchange,提问作者ZZZZZZZZZ
相关产品推荐
相关产品推荐

