TensorFlow导出输出,预测输出和指定signature_constants.DEFAULT_SERVING_SIGNATURE_DEF_KEY

2024-10-01 01:42:51 发布

您现在位置:Python中文网/ 问答频道 /正文

上下文

我有一个colab和一个非常简单的演示^{},目的是学习/理解^{}API,目标是为一个即插即用模型制定一个惯例,其中包含有用的折价策略(例如,如果验证集停止改进,则提前停止,导出模型等)。在

三个^{}模式(TRAINEVAL,和PREDICT)中的每一个都返回一个^{}。在

根据docs

__new__(
    cls,
    mode,
    predictions=None,          # required by PREDICT
    loss=None,                 # required by TRAIN and EVAL
    train_op=None,             # required by TRAIN
    eval_metric_ops=None,
    export_outputs=None,
    training_chief_hooks=None,
    training_hooks=None,
    scaffold=None,
    evaluation_hooks=None,
    prediction_hooks=None.     
)

在这些命名参数中,我想提请注意predictions和{},它们在{a6}中描述为:

  • predictions: Predictions Tensor or dict of Tensor.
  • export_outputs: Describes the output signatures to be exported to SavedModel and used during serving. A dict {name: output} where:
    • name: An arbitrary name for this output.
    • output: an ExportOutput object such as ClassificationOutput, RegressionOutput, or PredictOutput. Single-headed models only need to specify one entry in this dictionary. Multi-headed models should specify one entry for each head, one of which must be named using signature_constants.DEFAULT_SERVING_SIGNATURE_DEF_KEY. If no entry is provided, a default PredictOutput mapping to predictions will be created.

因此,我为什么要提出export_outputs;也就是说,因为人们很可能希望使用他们在将来训练的模型(通过从SavedModel加载它)。在

为了使这个问题更容易理解/澄清:

  • “单头”模型是人们遇到的最常见的模型,其中input_fnfeatures被转换成单数(批处理)output

  • “多头”模型是指有多个输出的模型

例如,这个多头模型的input_fn(根据^{}api)返回一个元组(features, labels),即这个模型有两个头部)。在

^{pr2}$

如何指定signature_constants.DEFAULT_SERVING_SIGNATURE_DEF_KEY是这个问题的核心。也就是说,一个人如何指定它?(例如,应该是dict {signature_constants.DEFAULT_SERVING_SIGNATURE_DEF_KEY: head}

对,所以在colab中,您可以看到我们的模型的export_outputs实际上是以多个头部的方式定义的(尽管它不应该是):

{21}来自cd21}:

def model_fn(...):

    # ...

    # send the features through the graph
    MODEL = build_fn(MODEL)

    # prediction
    MODEL['predictions'] = {'labels': MODEL['net_logits']} # <--- net_logits added in the build_fn

    MODEL['export_outputs'] = {
        k: tf.estimator.export.PredictOutput(v) for k, v in MODEL['predictions'].items()
    }

    # ...

在这个特定的例子中,如果我们扩展字典的理解,我们得到的功能等价物是:

MODEL['export_outputs'] = {
    'labels': tf.estimator.export.PredictOutput(MODEL['net_logits'])
}

在这个例子中,我们的字典只有一个键,因此有一个^{},在colab中,我们的model_fn只有一个头,格式更合适:

MODEL['export_outputs'] = {
    'predictions': tf.estimator.export.PredictOutput(MODEL['predictions'])
}

正如它在^{}中所述:

__init__(outputs)

在哪里

  • outputs:表示预测的张量或字符串到张量的dict。在

问题

因此,我的问题如下:

  1. 如果^{}可以是字典,那么何时/为什么要用多个^{}作为^{}export_outputs

  2. 如果一个人有一个多头模型(比如用多个^{}s),那么实际如何指定signature_constants.DEFAULT_SERVING_SIGNATURE_DEF_KEY

  3. ^{}中的predictions也是export_outputs中的“必需”时,它的作用是什么?


Tags: theto模型noneoutputmodelexportoutputs
1条回答
网友
1楼 · 发布于 2024-10-01 01:42:51

谢谢你的详细问题,你显然已经深挖了。在

  1. 还有一些类用于RegressionOutput和ClassificationOutput,它们不能是字典。使用导出输出dict可以对这些用例进行概括。

  2. 默认情况下,您希望从保存的模型中接收服务的头部应使用默认的签名密钥。例如:

export_outputs = {
  signature_constants.DEFAULT_SERVING_SIGNATURE_DEF_KEY:
    PredictOutput(outputs={'some_output_1': output_1}),
  'head-2': PredictOutput(outputs={'some_output_2': output_2}),
  'head-3': PredictOutput(outputs={'some_output_3': output_3})
}
  1. 原因1:许多人使用默认的export_输出(这又是预测值),或者不导出到保存的模型。原因二:历史。预测首先出现,随着时间的推移,越来越多的功能被添加。这些特性需要灵活性和额外的信息,因此被独立地打包到估计器规范中。在

相关问题 更多 >