我正在阅读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'是什么意思?
答案 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_example
是tf.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()