在上一个问题中,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}
有效......(即使它不应该......)
慕容森
慕森卡
慕码人8056858
相关分类