将TensorFlow Seq2Seq NMT模型保存为.h5格式时遇属性错误
解决TensorFlow Seq2Seq模型保存为.h5格式的AttributeError问题
你基于TensorFlow Seq2Seq NMT教程开发项目时,尝试将模型保存为.h5格式,编写了如下包装类与保存代码:
# exporting model class Export(tf.Module): def __init__(self, model): super(Export,self).__init__() self.model = model @tf.function(input_signature=[tf.TensorSpec(dtype=tf.string, shape=[None])]) def translate(self, inputs): return self.model.translate(inputs)
保存代码:
export = Export(foo_model) tf.keras.models.save_model(export, f"/gdrive/My Drive/model-translator-.h5", signatures={'serving_default': export.translate})
运行后触发错误:
/usr/local/lib/python3.7/dist-packages/keras/saving/saving_utils.py in try_build_compiled_arguments(model) 349 if ( 350 not version_utils.is_v1_layer_or_model(model) --> 351 and model.outputs is not None 352 ): 353 try: AttributeError: 'Export' object has no attribute 'outputs'
问题原因
tf.keras.models.save_model是为Keras原生模型(继承自tf.keras.Model)设计的保存接口,而你定义的Export类继承自tf.Module,它不具备Keras模型要求的outputs属性,因此保存流程中会触发属性缺失的错误。
解决方案
方案1:修改包装类继承自Keras Model(保留.h5格式)
将Export类改为继承tf.keras.Model,并实现call方法(Keras模型的核心推理方法):
class Export(tf.keras.Model): def __init__(self, model): super(Export, self).__init__() self.model = model @tf.function(input_signature=[tf.TensorSpec(dtype=tf.string, shape=[None])]) def call(self, inputs): return self.model.translate(inputs)
保存前先让模型构建输入输出张量(确保Keras识别到outputs),再执行保存:
export = Export(foo_model) # 传入测试输入触发模型构建 _ = export(tf.constant(["sample input"])) tf.keras.models.save_model(export, f"/gdrive/My Drive/model-translator-.h5", signatures={'serving_default': export.call})
方案2:使用TensorFlow官方推荐的SavedModel格式
如果你没有严格的.h5格式要求,推荐使用SavedModel格式——这是TensorFlow对tf.Module和自定义模型支持最好的保存格式:
export = Export(foo_model) tf.saved_model.save(export, f"/gdrive/My Drive/model-translator")
加载模型时直接调用:
loaded_translator = tf.saved_model.load(f"/gdrive/My Drive/model-translator") translation_result = loaded_translator.translate(tf.constant(["Hello world"]))
内容的提问来源于stack exchange,提问作者Jansen Lloyd Macabangun
相关产品推荐
相关产品推荐

