如何在 TensorFlow 1.13 中检查 TFRecord 文件的结构?

Emi*_*oss 2 python training-data tensorflow tfrecord

我对 TFRecord 文件格式以及如何使用它感到困惑。我有一个 TFRecord,但不知道它究竟包含什么以及它的结构是什么。如何打印和检查 TFRecord 和/或其 TFExamples?我基本上问了与这个问题相同的问题,但是那个答案已经过时了。打印output_shapes,output_typesoutput_classesmyTFRecord告诉我什么都没有(为什么?)。该tf.io.tf_record_iterator()函数已被弃用,但 TFRecord 数据集现在看起来自己是可迭代的(但为什么仍然需要其他迭代器?)。然而,简单地打印每次迭代会返回乱码,并tf.train.Example.FromString(example)抛出一个TypeError: a bytes-like object is required, not 'tensorflow.python.framework.ops.EagerTensor'. 这一切都比较混乱。简单地初始化一个tf.data.Datasetusingfrom_tensor_slices() 看起来更容易检查,实际上提供了有关其形状和类型的信息。

Sha*_*rky 5

您可以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())
Run Code Online (Sandbox Code Playgroud)

这将输出特征名称和类型(在这种情况下是bytes_list)

dict_keys(['label', 'width', 'image_raw', 'height'])
Run Code Online (Sandbox Code Playgroud)

还要输出数据类型,您需要

print(dict(example.features.feature).values())
Run Code Online (Sandbox Code Playgroud)

但这也会打印原始字符串,并且您可以达到屏幕长度限制。

当您知道它的编码方式时,您可以通过以下方式访问值

string = example.features.feature['image_raw'].bytes_list.value[0]
output = np.fromstring(string, dtype)
Run Code Online (Sandbox Code Playgroud)

你可以在这里阅读更多关于它的信息https://www.tensorflow.org/tutorials/load_data/tf_records

编辑:如果开启了急切模式,您可以直接迭代数据集对象,使用 numpy 进行解码

for str_rec in tf.data.TFRecordDataset('file.tfrecords'):
    output = np.fromstring(str_rec.numpy(), dtype))
Run Code Online (Sandbox Code Playgroud)

或本机TF。 tf.io.decode_raw(str_rec, tf.uint8))

但是,这将为您提供一个展平数组,例如,它不会携带有关图像尺寸大小的任何信息