首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >指定signature_constants.DEFAULT_SERVING_SIGNATURE_DEF_KEY的TensorFlow ExportOutputs、PredictOuput和

指定signature_constants.DEFAULT_SERVING_SIGNATURE_DEF_KEY的TensorFlow ExportOutputs、PredictOuput和
EN

Stack Overflow用户
提问于 2018-11-21 14:22:37
回答 1查看 1.2K关注 0票数 5

上下文

我有一个colab,它有一个非常简单的演示Estimator,目的是学习/理解Estimator API,目的是为即插即用模型制定一个约定,其中包含有用的tack (例如,如果验证集停止改进,导出模型等等)。

三种Estimator模式(TRAINEVALPREDICT)中的每一种都返回EstimatorSpec

根据文档

代码语言:javascript
复制
__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.     
)

在这些命名的论点中,我想提请注意predictionsexport_outputs,它们在文档中被描述为:

  • predictions:预测张量或张量。
  • export_outputs:描述要导出到SavedModel并在服务期间使用的输出签名。一个dict {name: output}其中:
    • name:此输出的任意名称。
    • outputExportOutput对象,如ClassificationOutputRegressionOutputPredictOutput。单头模型只需在本词典中指定一个条目。多头模型应该为每个头指定一个条目,其中一个必须使用signature_constants.DEFAULT_SERVING_SIGNATURE_DEF_KEY命名。如果没有提供条目,则将创建到预测的默认PredictOutput映射。

因此,我提出export_outputs的原因应该很清楚;也就是说,人们很可能希望使用他们将来训练过的模型(通过从SavedModel加载它)。

为了使这个问题更容易理解/增加一些清晰性:

  • “单头”模型是人们遇到的最常见的模型,其中input_fn features被转换为单数(批) output
  • “多头”模型是指有多个输出的模型。

例如,这个多头模型的input_fn (按照Estimator api)返回一个元组(features, labels),即这个模型有两个头)。

代码语言:javascript
复制
def input_fn():
  features = ...
  labels1 = ...
  labels2 = ...
  return features, {'head1': labels1, 'head2': labels2}

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

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

来自estimator functions > model_fn of colab

代码语言:javascript
复制
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()
    }

    # ...

在这个特殊的例子中,如果我们扩展字典的理解,我们就有功能等价于:

代码语言:javascript
复制
MODEL['export_outputs'] = {
    'labels': tf.estimator.export.PredictOutput(MODEL['net_logits'])
}

它在本例中工作,因为我们的字典只有一个键,因此有一个PredictOutput,在colab中,我们的model_fn只有一个头,格式更正确:

代码语言:javascript
复制
MODEL['export_outputs'] = {
    'predictions': tf.estimator.export.PredictOutput(MODEL['predictions'])
}

正如它在PredictOutput中所说的那样

代码语言:javascript
复制
__init__(outputs)

哪里

  • outputs:表示预测的张量或字符串块。

问题

因此,我的问题如下:

  1. 如果PredictOutput可以成为字典,那么何时/为什么需要多个PredictOutput作为EstimatorSpecexport_outputs
  2. 如果一个人有一个多头模型,(比如多个PredictOutput),如何实际指定signature_constants.DEFAULT_SERVING_SIGNATURE_DEF_KEY
  3. predictionsEstimatorSpec中也是“必需的”(对于任何关心使用SavedModel的人)在export_outputs中有什么意义?
EN

回答 1

Stack Overflow用户

发布于 2019-05-17 23:27:10

谢谢你提出的详细问题,你显然已经深入到这里来了。

  1. 也有RegressionOutput和ClassificationOutput的类,它们不能成为字典。使用export_outputs dict允许对这些用例进行泛化。
  2. 默认情况下,您希望从保存的模型中得到的头部应该采用默认的签名密钥。例如:
代码语言:javascript
复制
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_outputs (这反过来就是预测的值),或者不导出到保存的模型。理由二:历史。预测是第一位的,随着时间的推移,增加了越来越多的特性。这些特性需要灵活性和额外的信息,因此独立地打包到EstimatorSpec中。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53414168

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档