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

时间:2019-04-26 06:25:02

标签: python tensorflow training-data tfrecord

我对TFRecord文件格式以及如何使用它感到困惑。我有一个TFRecord,但对其确切包含的内容及其结构却一无所知。如何打印和检查TFRecord和/或其TFExamples?我本质上是在问与this question相同的问题,但该问题的答案已过时。打印我的output_shapes的{​​{1}},output_typesoutput_classes并不会告诉我(为什么?)。 TFRecord函数已被弃用,但TFRecord数据集现在看来是可迭代的(但是为什么为什么仍然需要the other迭代器?)。但是,仅打印每次迭代将返回乱码,并且tf.io.tf_record_iterator()会抛出tf.train.Example.FromString(example)。一切都很混乱。简单地使用TypeError: a bytes-like object is required, not 'tensorflow.python.framework.ops.EagerTensor'初始化tf.data.Dataset似乎很容易检查,并且实际上提供了有关其形状和类型的信息。

1 个答案:

答案 0 :(得分:1)

您可以使用tf.python_io.tf_record_iterator检查tfrecords文件。它创建一个generato。要访问单个示例,您需要对其进行迭代:

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))

但是,这将为您提供一个扁平的数组,例如,该数组将不包含有关图像尺寸大小的任何信息