为什么tf.placeholder返回序列化的示例?

时间:2018-03-23 07:35:49

标签: tensorflow

我正在阅读mnist_saved_model.py

在第62~64行,tf.placeholder返回序列化示例。而tf.parse_example函数就像这样使用它,

serialized_tf_example = tf.placeholder(tf.string, name='tf_example’)
feature_configs = {'x': tf.FixedLenFeature(shape=[784], dtype=tf.float32),}
tf_example = tf.parse_example(serialized_tf_example, feature_configs)

我知道placeholder会返回Tensor。然后,究竟'序列化tf.Example'是什么意思?

1 个答案:

答案 0 :(得分:1)

tf.placeholder可以用作为不同类型数据建模的入口点。例如,您可以使用x = tf.placeholder(shape=[784], dtype=tf.float32),它适用于为形状为[784]的NumPy数组提供数据并输入float。

在您的示例中,占位符应使用string类型。如果您直接从文本文件或TFRecord / protobuf(这是一种序列化数据的格式)获取数据,这将非常有用。 (要从protobuf获取字符串,您可以使用tf.python_io.tf_record_iterator。您还可以使用tf.data.Dataset API。

从TFRecord文件中获取字符串时,它是您示例的序列化表示形式。您现在想要将其解析为tf.Tensor。这是使用tf.parse_example完成的。 feature_configs字典指定如何解析字符串中的数据。

(注意:tf.parse_example实际上并不解析任何内容 - 它只会向可以执行解析的计算图形添加一个操作。当您使用sess.run(...))运行图形时,将发生解析本身< / p>

解析后的张量为tf_example['x']

修改

详细说明,作为对your comment的回复:在您的示例中,serialized_tf_exampletf.Tensor(可以通过运行type(serialized_tf_example)来验证)。它的数据类型是字符串(可以通过运行serialized_tf_example.dtype来验证)。与所有张量一样,这意味着您可以为其提供任何数据类型的多维数组(即字符串)。 (如果在tf.placeholder()调用中,您将为shape参数赋值,这将强制您为多维数组使用特定形状。因此,例如,这些是有效的调用:

sess = tf.Session()
sess.run(serialized_tf_example, feed_dict={serialized_tf_example:'abc'})
sess.run(serialized_tf_example, feed_dict={serialized_tf_example:[['some','strings'],['in an','array']]})

此张量实例名为serialized_example,因为其目的是使用将要处理的示例的序列化编码。然后使用tf.parse_example()

将此张量从此编码转换为数字多维数组