如何检查 Tensorflow .tfrecord 文件?

Posted

技术标签:

【中文标题】如何检查 Tensorflow .tfrecord 文件?【英文标题】:How to inspect a Tensorflow .tfrecord file? 【发布时间】:2017-07-12 16:26:31 【问题描述】:

我有一个.tfrecord,但我不知道它的结构。如何检查架构以了解 .tfrecord 文件包含的内容?

所有 *** 答案或文档似乎都假定我知道文件的结构。

reader = tf.TFRecordReader()
file = tf.train.string_input_producer("record.tfrecord")
_, serialized_record = reader.read(file)

...HOW TO INSPECT serialized_record...

【问题讨论】:

【参考方案1】:

找到了!

import tensorflow as tf

for example in tf.python_io.tf_record_iterator("data/foobar.tfrecord"):
    print(tf.train.Example.FromString(example))

您还可以添加:

from google.protobuf.json_format import MessageToJson
...
jsonMessage = MessageToJson(tf.train.Example.FromString(example))

【讨论】:

看来这个解决方案没有显示文件的所有内容。 是这样吗?我没有那个问题 如果我没记错的话,这会遍历整个 TFRecord 文件,为您提供一个示例的内容。有没有更有效的方法来阅读一个例子?【参考方案2】:

以上解决方案对我不起作用,所以对于 TF 2.0 使用这个:

import tensorflow as tf 
raw_dataset = tf.data.TFRecordDataset("path-to-file")

for raw_record in raw_dataset.take(1):
    example = tf.train.Example()
    example.ParseFromString(raw_record.numpy())
    print(example)

https://www.tensorflow.org/tutorials/load_data/tfrecord#reading_a_tfrecord_file_2

【讨论】:

答案应该改成这个 这是一个【参考方案3】:

如果您的 .tftrecord 包含 SequenceExample,则接受的答案不会显示所有内容。您可以使用:

import tensorflow as tf

for example in tf.python_io.tf_record_iterator("data/foobar.tfrecord"):
    result = tf.train.SequenceExample.FromString(example)
    break
print(result)

这将显示第一个示例的内容。

然后您还可以使用它们的键检查各个功能:

result.context.feature["foo_key"]

对于功能列表:

result.feature_lists.feature_list["bar_key"]

【讨论】:

【参考方案4】:

将 TensorFlow tf.TFRecordReadertf.parse_single_example 解码器一起使用,如 https://www.tensorflow.org/programmers_guide/reading_data 中指定的那样

PS,tfrecord 包含在https://github.com/tensorflow/tensorflow/blob/master/tensorflow/core/example/example.proto 中定义的“示例”记录

一旦你将记录提取成一个字符串,解析它是这样的

a=tf.train.Example()
result = a.ParseFromString(binary_string_with_example_record)

但是,我不确定从文件中提取单个记录的原始支持在哪里,您可以在 TFRecordReader 中找到它

【讨论】:

TFRecord 文件必须按照文档从头开始顺序读取。我确信有一种方法可以随机阅读它们,但可能没有受支持的标准。 链接断开11111【参考方案5】:

如果可以选择安装另一个 Python 包,tfrecord_lite 非常方便。

例子:

In [1]: import tensorflow as tf
   ...: from tfrecord_lite import decode_example
   ...:
   ...: it = tf.python_io.tf_record_iterator('nsynth-test.tfrecord')
   ...: decode_example(next(it))
   ...:
Out[1]:
'audio': array([ 3.8138387e-06, -3.8721851e-06,  3.9331076e-06, ...,
        -3.6526076e-06,  3.7041993e-06, -3.7578957e-06], dtype=float32),
 'instrument': array([417], dtype=int64),
 'instrument_family': array([0], dtype=int64),
 'instrument_family_str': [b'bass'],
 'instrument_source': array([2], dtype=int64),
 'instrument_source_str': [b'synthetic'],
 'instrument_str': [b'bass_synthetic_033'],
 'note': array([149013], dtype=int64),
 'note_str': [b'bass_synthetic_033-100-100'],
 'pitch': array([100], dtype=int64),
 'qualities': array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0], dtype=int64),
 'sample_rate': array([16000], dtype=int64),
 'velocity': array([100], dtype=int64)

您可以通过pip install tfrecord_lite 安装它。

【讨论】:

【参考方案6】:

改进已接受的解决方案:

import tensorflow as tf
import json

dataset = tf.data.TFRecordDataset("mydata.tfrecord")
for d in dataset:
    ex = tf.train.Example()
    ex.ParseFromString(d.numpy())
    m = json.loads(MessageToJson(ex))
    print(m['features']['feature'].keys())

在我的例子中,我在 TF2 上运行,单个示例太大而无法显示在我的屏幕上,因此我需要使用字典来检查键(接受的解决方案返回完整的字符串)。

【讨论】:

MessageToJson 是否来自 google protobuf?【参考方案7】:

我推荐以下脚本:tfrecord-view。

它可以使用 TF 和 openCV 方便地对 TF 记录进行目视检查,尽管需要进行一些修改(对于标签等)。 查看存储库中的更多说明

【讨论】:

以上是关于如何检查 Tensorflow .tfrecord 文件?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 TFRecord 数据集使 TensorFlow + Keras 快速运行?

使用tensorflow中的Dataset来读取制作好的tfrecords文件

如何使用tfrecord

tensorflow-TFRecord报错ValueError: Protocol message Feature has no "feature" field.

Spark-TFRecord:Apache Spark与TensorFlow TFRecord互操作示例

tensorflow的tfrecord操作代码与数据协议规范