如何在 TensorFlow 1.13 中检查 TFRecord 文件的结构?
How to inspect the structure of a TFRecord file in TensorFlow 1.13?
我对 TFRecord 文件格式及其使用方法感到很困惑。我有一个 TFRecord,但不知道它到底包含什么以及它的结构是什么。如何打印和检查 TFRecord and/or 它的 TFExamples?我本质上是在问与 , but the answers to that one are outdated. Printing the output_shapes
, output_types
or output_classes
of my TFRecord
tells me nothing (why?). The tf.io.tf_record_iterator()
function is deprecated, but TFRecord datasets now appear themselves iterable (but then why would one still need the other 迭代器相同的问题?)。然而,简单地打印每个迭代 returns 乱码,并且 tf.train.Example.FromString(example)
抛出 TypeError: a bytes-like object is required, not 'tensorflow.python.framework.ops.EagerTensor'
。这一切都相当混乱。使用 from_tensor_slices()
简单地初始化一个 tf.data.Dataset
似乎更容易检查,并且实际上提供了关于它的形状和类型的信息。
您可以使用 tf.python_io.tf_record_iterator
检查 tfrecords 文件。它创建了一个生成器。要访问单个示例,您需要对其进行迭代:
for str_rec in tf.python_io.tf_record_iterator('file.tfrecords'):
example = tf.train.Example()
example.ParseFromString(str_rec)
print(dict(example.features.feature).keys())
这将输出特征名称和类型(在本例中为bytes_list)
dict_keys(['label', 'width', 'image_raw', 'height'])
要同时输出数据类型,您需要
print(dict(example.features.feature).values())
但这也会打印原始字符串,并且您可以达到屏幕长度限制。
当您知道它的编码方式时,您可以通过
访问值
string = example.features.feature['image_raw'].bytes_list.value[0]
output = np.fromstring(string, dtype)
您可以在此处阅读更多相关信息 https://www.tensorflow.org/tutorials/load_data/tf_records
编辑:
如果开启了 eager 模式,你可以直接遍历数据集对象,使用 numpy 来解码
for str_rec in tf.data.TFRecordDataset('file.tfrecords'):
output = np.fromstring(str_rec.numpy(), dtype))
或原生TF。 tf.io.decode_raw(str_rec, tf.uint8))
但是,这会给你一个展平的数组,它不会携带任何关于图像尺寸大小的信息,例如
我对 TFRecord 文件格式及其使用方法感到很困惑。我有一个 TFRecord,但不知道它到底包含什么以及它的结构是什么。如何打印和检查 TFRecord and/or 它的 TFExamples?我本质上是在问与 output_shapes
, output_types
or output_classes
of my TFRecord
tells me nothing (why?). The tf.io.tf_record_iterator()
function is deprecated, but TFRecord datasets now appear themselves iterable (but then why would one still need the other 迭代器相同的问题?)。然而,简单地打印每个迭代 returns 乱码,并且 tf.train.Example.FromString(example)
抛出 TypeError: a bytes-like object is required, not 'tensorflow.python.framework.ops.EagerTensor'
。这一切都相当混乱。使用 from_tensor_slices()
简单地初始化一个 tf.data.Dataset
似乎更容易检查,并且实际上提供了关于它的形状和类型的信息。
您可以使用 tf.python_io.tf_record_iterator
检查 tfrecords 文件。它创建了一个生成器。要访问单个示例,您需要对其进行迭代:
for str_rec in tf.python_io.tf_record_iterator('file.tfrecords'):
example = tf.train.Example()
example.ParseFromString(str_rec)
print(dict(example.features.feature).keys())
这将输出特征名称和类型(在本例中为bytes_list)
dict_keys(['label', 'width', 'image_raw', 'height'])
要同时输出数据类型,您需要
print(dict(example.features.feature).values())
但这也会打印原始字符串,并且您可以达到屏幕长度限制。
当您知道它的编码方式时,您可以通过
访问值string = example.features.feature['image_raw'].bytes_list.value[0]
output = np.fromstring(string, dtype)
您可以在此处阅读更多相关信息 https://www.tensorflow.org/tutorials/load_data/tf_records
编辑: 如果开启了 eager 模式,你可以直接遍历数据集对象,使用 numpy 来解码
for str_rec in tf.data.TFRecordDataset('file.tfrecords'):
output = np.fromstring(str_rec.numpy(), dtype))
或原生TF。 tf.io.decode_raw(str_rec, tf.uint8))
但是,这会给你一个展平的数组,它不会携带任何关于图像尺寸大小的信息,例如