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

将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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 22:20:27