TFRecord
这篇文章基于一个生成tfrecord和解析tfrecord的代码,对TFRecord进行了详细的解析。
读者查看https://github.com/Nora919530829/tfrecord网站地址,通过 git clone https://github.com/Nora919530829/tfrecord.git 下载代码进行学习。代码主要参考http://www.machinelearninguru.com/deep_learning/tensorflow/basics/tfrecord/tfrecord.html
一. 什么是TFRecord?
Tensorflow的文档中说:
“… approach is to convert whatever data you have into a supported format. This approach makes it easier to mix and match data sets and network architectures. The recommended format for TensorFlow is a TFRecords file containing tf.train.Example protocol buffers (which contain Features as a field).”
Tensorflow的TFRecord文件格式,是一种二进制存储格式。
- 如果您正在处理大型数据集,则使用二进制文件格式存储数据在磁盘上占用的空间更少,复制时间更短,并且可以从磁盘更有效地读取。
- 特别是对于太大而无法完全存储在存储器中的数据集,TFRecord可以进行例如批处理,只有当时所需的数据从磁盘加载然后被处理。
- TFRecords的另一个主要优点是可以存储序列数据 - 例如,时间序列或字编码。
二. 构建TFRecords
TFRecord文件将您的数据存储为二进制字符串序列。 这意味着您需要在将数据写入文件之前指定数据的结构。Tensorflow为此提供了两个组件:tf.train.Example和tf.train.SequenceExample。 您必须将每个数据样本存储在其中一个结构中,然后对其进行序列化并使用tf.python_io.TFRecordWriter将其写入磁盘。
注意:tf.train.Example 不是一个普通的python的类,而是一个protocol buffer
三. 生成TFRecords
- 以Movie recommendations为例
生成TFRecord文件可以分成以下几步:
- Use
tf.python_io.TFRecordWriter
to open the tfrecord file and start writing. - Before writing into tfrecord file, the image data and label data should be converted into proper datatype. (byte, int, float)
- Now the datatypes are converted into
tf.train.Feature
- Finally create an
Example Protocol Buffer
using tf.Example and use the converted features into it. Serialize the Example using serialize() function. - Write the serialized
Example
.
Let’s use the movie recommendation application from the Tensorflow documentation as an example:
- tf.train.BytesList,tf.train.FloatList和tf.train.Int64List是tf.train.Feature的核心。 这三个都有一个属性值,它需要一个 bytes, float, and int列表。
movie_name_list = tf.train.BytesList(value=[b'The Shawshank Redemption', b'Fight Club'])
movie_rating_list = tf.train.FloatList(value=[9.0, 9.7])
- tf.train.Feature包含特定类型的数据列表。它有一个属性,bytes_list / float_list / int64_list。
movie_names = tf.train.Feature(bytes_list=movie_name_list)
movie_ratings = tf.train.Feature(float_list=movie_rating_list)
- tf.train.Features是a collection of named features。 它需要一个字典,其中键是功能的名称,值是tf.train.Feature。
movie_dict = {
'Movie Names': movie_names,
'Movie Ratings': movie_ratings
}
movies = tf.train.Features(feature=movie_dict)
-
tf.train.Example
example = tf.train.Example(features=movies)
- tf.python_io.TFRecordWriter是一个Python类。 它在其path属性中接受文件路径,并创建一个与任何其他文件对象一样工作的writer对象。 TFRecordWriter类提供write,flush和close方法。 write方法接受一个字符串作为参数并将其写入磁盘,这意味着必须首先序列化结构化数据。 为此,tf.train.Example和tf.train.SequenceExample提供了SerializeToString方法。
with tf.python_io.TFRecordWriter('movie_ratings.tfrecord') as writer:
writer.write(example.SerializeToString())
四. 解析TFRecords
阅读TFRecords的过程:
- 使用tf.TFRecordReader读取TFRecord。
- 使用tf.FixedLenFeature和tf.VarLenFeature定义TFRecord中所需的功能,具体取决于在tf.train.Example定义期间定义的内容。
- 使用tf.parse_single_example一次解析一个tf.train.Example(一个文件)。
可以参考:
本文的参考如下:
1. https://blog.youkuaiyun.com/happyhorizion/article/details/77894055 特别详细的中文介绍 tensorflow读取数据-tfrecord格式
2. https://www.skcript.com/svr/why-every-tensorflow-developer-should-know-about-tfrecord/
- 英文整体介绍了什么是tfrecord,tfrecord的优点,还有生成tfrecord和解析tfrecord的大体过程
- 生成TFRecord: Data --> FeatureSet --> Example --> Serialized Example --> tfrecord
- 解析TFRecord: tfrecord --> Serialized Example --> Example --> FeatureSet --> Data
3. https://medium.com/mostly-ai/tensorflow-records-what-they-are-and-how-to-use-them-c46bc4bbb564
- 英文非常非常非常详细介绍了如何一步一步生成TFRecord和解析TFRecord,并且告诉了每一个函数的意思
- 真的非常非常好,耐心看
4. http://www.machinelearninguru.com/deep_learning/tensorflow/basics/tfrecord/tfrecord.html
- 英文How to write into and read from a TFRecords file in TensorFlow
- 利用一个例子详细讲解,也非常非常好
5. 当然,github上搜索tfrecord也可以看到很多优秀的关于TFRecords的代码