【问题标题】:Tensorflow 2.0: How to change the output signature while using tf.saved_modelTensorflow 2.0:如何在使用 tf.saved_model 时更改输出签名
【发布时间】:2020-03-27 06:00:12
【问题描述】:

我想更改保存的模型的输入和输出签名,我使用 tf.Module 对象来构建主模型的操作。

class Generator(tf.Module):
    def __init__(....):
        super(Generator, self).__init__(name=name)
        ...       
        with self.name_scope:
             ...
    @tf.Module.with_name_scope
    def __call__(self, input):
        ...

    @tf.function
    def serve_function(self, input):
        out = self.__call__(input)
        return out



call = model.Generator.serve_function.get_concrete_function(tf.TensorSpec([None, 256, 256, 3], tf.float32))
tf.saved_model.save(model.Generator, os.path.join(train_log_dir, 'frozen'))

然后我正在加载模型,但我有签名“default_serving”和“output_0”,我该如何更改?

【问题讨论】:

    标签: python tensorflow tensorflow2.0 generative-adversarial-network


    【解决方案1】:

    我找到了一种在不使用 tf.Module 的情况下定义输出签名的方法,方法是定义一个 tf.function,它返回一个输出字典,其中字典中使用的键将是输出名称。

    # Create the model
    model = ...
    
    # Train the model
    model.fit(...)
    
    # Define where to save the model
    export_path = "..."
    
    @tf.function()
    def my_predict(my_prediction_inputs):
       inputs = {
            'my_serving_input': my_prediction_inputs,
       }
       prediction = model(inputs)
       return {"my_prediction_outputs": prediction}
    
    my_signatures = my_predict.get_concrete_function(
       my_prediction_inputs=tf.TensorSpec([None,None], dtype=tf.dtypes.float32, name="my_prediction_inputs")
    )
    
    # Save the model.
    tf.saved_model.save(
        model,
        export_dir=export_path,
        signatures=my_signatures
    )
    
    

    这会产生以下签名:

    signature_def['serving_default']:
      The given SavedModel SignatureDef contains the following input(s):
        inputs['my_prediction_inputs'] tensor_info:
            dtype: DT_FLOAT
            shape: (-1, -1)
            name: serving_default_my_prediction_inputs:0
      The given SavedModel SignatureDef contains the following output(s):
        outputs['my_prediction_outputs'] tensor_info:
            dtype: DT_FLOAT
            shape: (-1, 1)
            name: StatefulPartitionedCall:0
      Method name is: tensorflow/serving/predict
    

    【讨论】:

    • 感谢您的回答!我会尝试用 tf.Module 进行测试,应该类似
    • 这里的self.serving._model 是什么?由于我们使用的装饰器,它会一直可用吗?
    • 嗨@JashShah。抱歉,self.serving._model 是从本地项目的复制粘贴中遗留下来的。我已经删除了引用并将其替换为model。所以,model 只是 TensorFlow 对象。它与您调用 model.fit() 时使用的对象相同。
    【解决方案2】:

    创建serving_default签名的另一种方式是:

    import tensorflow as tf
    import tensorflow_hub as hub
    import tensorflow_text
    
    export_dir = "./models/use/00000001"
    module = hub.load("https://tfhub.dev/google/universal-sentence-encoder-multilingual-large/3")
    
    @tf.function
    def my_module_encoder(text):
       inputs = {
            'text': text,
       }
       outputs = {
            'embeddings': module(text)
       }
       return outputs
    
    tf.saved_model.save(
        module, 
        export_dir, 
        signatures=my_module_encoder.get_concrete_function(
            text=tf.TensorSpec(shape=None, dtype=tf.string)
        ), 
        options=None
    )
    

    您可以使用saved_model_cli 命令查看创建的SignatureDefs 签名,如下所示:

    $ saved_model_cli show --all  --dir models/use/00000001
    
    MetaGraphDef with tag-set: 'serve' contains the following SignatureDefs:
    
    signature_def['__saved_model_init_op']:
      The given SavedModel SignatureDef contains the following input(s):
      The given SavedModel SignatureDef contains the following output(s):
        outputs['__saved_model_init_op'] tensor_info:
            dtype: DT_INVALID
            shape: unknown_rank
            name: NoOp
      Method name is:
    
    signature_def['serving_default']:
      The given SavedModel SignatureDef contains the following input(s):
        inputs['text'] tensor_info:
            dtype: DT_STRING
            shape: unknown_rank
            name: serving_default_text:0
      The given SavedModel SignatureDef contains the following output(s):
        outputs['embeddings'] tensor_info:
            dtype: DT_FLOAT
            shape: (-1, 512)
            name: StatefulPartitionedCall:0
      Method name is: tensorflow/serving/predict
    

    【讨论】:

    • 假设我保存的模型是无监督(聚类)模型,在这种情况下我必须使用签名 def 格式。正如他们在本文档tensorflow.org/tfx/serving/signature_defs 中提到的那样,无监督模型没有特定格式。如果你有任何想法,能否请我帮忙。
    猜你喜欢
    • 1970-01-01
    • 2020-03-04
    • 2020-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多