上下文
我有一个colab,它有一个非常简单的演示Estimator,目的是学习/理解Estimator API,目的是为即插即用模型制定一个约定,其中包含有用的tack (例如,如果验证集停止改进,导出模型等等)。
三种Estimator模式(TRAIN、EVAL和PREDICT)中的每一种都返回EstimatorSpec。
根据文档
__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和export_outputs,它们在文档中被描述为:
predictions:预测张量或张量。export_outputs:描述要导出到SavedModel并在服务期间使用的输出签名。一个dict {name: output}其中:name:此输出的任意名称。output:ExportOutput对象,如ClassificationOutput、RegressionOutput或PredictOutput。单头模型只需在本词典中指定一个条目。多头模型应该为每个头指定一个条目,其中一个必须使用signature_constants.DEFAULT_SERVING_SIGNATURE_DEF_KEY命名。如果没有提供条目,则将创建到预测的默认PredictOutput映射。
因此,我提出export_outputs的原因应该很清楚;也就是说,人们很可能希望使用他们将来训练过的模型(通过从SavedModel加载它)。
为了使这个问题更容易理解/增加一些清晰性:
input_fn features被转换为单数(批) output。例如,这个多头模型的input_fn (按照Estimator api)返回一个元组(features, labels),即这个模型有两个头)。
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
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'])
}它在本例中工作,因为我们的字典只有一个键,因此有一个PredictOutput,在colab中,我们的model_fn只有一个头,格式更正确:
MODEL['export_outputs'] = {
'predictions': tf.estimator.export.PredictOutput(MODEL['predictions'])
}正如它在PredictOutput中所说的那样
__init__(outputs)哪里
outputs:表示预测的张量或字符串块。问题
因此,我的问题如下:
PredictOutput可以成为字典,那么何时/为什么需要多个PredictOutput作为EstimatorSpec的export_outputsPredictOutput),如何实际指定signature_constants.DEFAULT_SERVING_SIGNATURE_DEF_KEY?predictions在EstimatorSpec中也是“必需的”(对于任何关心使用SavedModel的人)在export_outputs中有什么意义?发布于 2019-05-17 23:27:10
谢谢你提出的详细问题,你显然已经深入到这里来了。
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})
}https://stackoverflow.com/questions/53414168
复制相似问题