猿问

TensorFlow Estimator ServingInputReceiver

在上一个问题中,serving_input_receiver_fn探讨了 的目的和结构,并在答案中:


def serving_input_receiver_fn():

  """For the sake of the example, let's assume your input to the network will be a 28x28 grayscale image that you'll then preprocess as needed"""

  input_images = tf.placeholder(dtype=tf.uint8,

                                         shape=[None, 28, 28, 1],

                                         name='input_images')

  # here you do all the operations you need on the images before they can be fed to the net (e.g., normalizing, reshaping, etc). Let's assume "images" is the resulting tensor.


  features = {'input_data' : images} # this is the dict that is then passed as "features" parameter to your model_fn

  receiver_tensors = {'input_data': input_images} # As far as I understand this is needed to map the input to a name you can retrieve later

  return tf.estimator.export.ServingInputReceiver(features, receiver_tensors)

该答案的作者状态(在问候receiver_tensors):


据我了解,这是将输入映射到稍后可以检索的名称所必需的


这种区别我不清楚。实际上,(请参阅此colab),可以将相同的字典传递给features和receiver_tensors。


从源代码的@estimator_export('estimator.export.ServingInputReceiver')(或ServingInputReceiver文档:


features:字符串 to or 的 A Tensor、SparseTensor或 dict ,指定要传递给模型的特征。注意:如果传递的不是字典,它将被包装在一个具有单个条目的字典中,使用“功能”作为键。因此,模型必须接受 {'feature': tensor} 形式的特征字典。如果您希望按原样传递张量,则可以使用 。TensorSparseTensorfeaturesTensorServingInputReceiver

receiver_tensors:字符串 to or 的A Tensor、SparseTensor或 dict ,指定默认情况下该接收器期望被馈送的输入节点。通常,这是一个期望序列化原型的单个占位符。TensorSparseTensortf.Example

阅读后,我很清楚这样做的目的features是什么。features是一个输入字典,然后我通过图表发送。许多常见模型只有一个输入,但您可以或当然有更多。


那么关于receiver_tensors“通常,这是一个期望序列化tf.Example原型的单个占位符。”的声明,对我来说,表明receiver_tensors想要(Sequence)Example从 TF Records解析出的s的单个批处理占位符。


为什么?如果 TFRecord是完全预处理的,那么这是多余的吗?如果没有完全预处理,为什么要通过它?features和receiver_tensors字典中的键应该相同吗?


有人可以为我提供一个更具体的例子来说明差异以及现在的情况


input_tensors = tf.placeholder(tf.float32, <shape>, name="input_tensors")

features = receiver_tensors =  {'input_tensors': input_tensors}

有效......(即使它不应该......)


Qyouu
浏览 290回答 3
3回答

慕容森

服务输入函数的工作是将接收到的原始特征转换为模型函数接受的已处理特征。receiver_tensors:这些是输入占位符。这将在您的图表中打开,您将在其中接收原始输入特征。定义此占位符后,您可以对这些接收器张量执行转换,以将它们转换为模型可接受的特征。其中一些转换将包括:预处理接收到的数据。来自 tfrecord 的解析示例。(如果您提供 tfrecord 作为服务功能的输入)features&nbsp;:一旦您变换接收张量特征,这些特征就会在预测过程中直接馈送到您的模型函数中。在您的情况下,您提供给服务输入功能的数据不需要预处理。因此features = receiver_tensors正在工作。

慕森卡

据我了解,SWAPNIL 的回答是正确的。我会分享一个我的例子。假设图的输入是一个形状占位符 [None, 64]inputs = tf.placeholder(dtype=tf.float32, shape=[None, 64])prediction = ... # do some prediction但是我们从上游得到的是 32 个浮点数的数组,我们需要将它们处理成 [None, 64] 的形状,例如,简单的重复它们。def serving_fn():&nbsp; &nbsp; inputs = tf.placeholder(dtype=tf.float32, shape=[None, 32])&nbsp; # this is raw input&nbsp; &nbsp; features = tf.concat([inputs, inputs], axis=1)&nbsp; # this is how we get model input from raw input&nbsp; &nbsp; return tf.estimator.export.TensorServingInputReceiver(features, inputs)当然,我们可以在外部执行此过程,并在定义图的输入时提供估算器数据。在这种情况下,我们连接上游过程中的输入,原始输入的形状为 [None, 64] 所以函数将是def serving_fn():&nbsp; &nbsp; inputs = tf.placeholder(dtype=tf.float32, shape=[None, 64])&nbsp; # this is raw input&nbsp; &nbsp; features = inputs&nbsp; # we simply feed the raw input to estimator&nbsp; &nbsp; return tf.estimator.export.TensorServingInputReceiver(features, inputs)

慕码人8056858

如果您在 TensorServingInputReceiver 中进行预处理,那么receiver_tensors 和功能会有所不同。在 TensorServingInputReceiver 内部进行预处理后,特征将传递给模型。receiver_tensors 是 TensorServingInputReceiver 的输入,它们可以是 tf.Example 格式
随时随地看视频慕课网APP

相关分类

Python
我要回答