Create-TFRecord
TFRecord是一种高效的数据存储格式,尤其是在处理大数据集时,我们无法对数据进行一次读取,这时我们就可以将文件存储为TFRecord,然后再进行读取。这样可以可以提高数据移动、读取、处理等速度。
在对小数据集进行读取时,可以直接使用tf.data
API来进行处理。
在TFRecord中是将每个样本example 以字典的方式进行存储。
主要的数据类型如下:
- int64:
tf.train.Feature(int64_list = tf.train.Int64List(value=输入))
- float32:
tf.train.Feature(float_list = tf.train.FloatList(value=输入))
- string:
tf.train.Feature(bytes_list=tf.train.BytesList(value=输入))
- 注:输入必须是list(向量)
这里我们举一个NLP中常见例子。
- 这里有10个句子
sentence
,每个句子有128个token_id
。 - 每个句子对应的10个标签
label
。 - 每个句子中对应的
token weight (mask)
- 每个句子经过
Embedding
后的 句子matrix
,tensor
(两者是同一个东西,只是为了后面介绍两种不同的存储方式。)
那么我们怎样将这些转换为TFRecord
呢?
Create_TFRecord.py
大致可以分为以下几步:
- 由于TFRecord中是将每个样本当做一个
example
进行存储。所以我们先要取得每个样本对应的sentence
,label
,weight
,matrix
,tensor
. - 将每个样本属性转换为对应的
feature
字典类型。(注意,这里的value
均为**list
**类型)- int64:
tf.train.Feature(int64_list = tf.train.Int64List(value=输入))
- float32:
tf.train.Feature(float_list = tf.train.FloatList(value=输入))
- string:
tf.train.Feature(bytes_list=tf.train.BytesList(value=输入))
- int64:
- 将feature字典包装成features。
features=tf.train.Features(feature=feature字典)
- 将features转换成example
example = tf.train.Example(features=features)
- 通过
example.SerializeToString()
将example 进行序列化,并通过tfwriter.write()
进行写入文件。
具体代码如下:
1 | import tensorflow as tf |
Read_TFRecord.py
在得到了TFRecord
后,我们又改如何解析呢?
解析大致也可以分为几个步骤:
通过
tf.data.TFRecordDataset
对TFRecord进行读取。在前面创建TFRecord时,我们需要创建feature字典,同样在解析时也需要定义一个feature_description字典,告诉程序,TFRecord中的数据类型。
定长特征解析:
tf.FixedLenFeature(shape, dtype, default_value)
- shape:可当
reshape
来用,如vector的shape从(3,)改动成了(1,3)。 - 注:如果写入的feature使用了
.tostring()
其shape就是()
- dtype:必须是
tf.float32
,tf.int64
,tf.string
中的一种。 - default_value:
feature
值缺失时所指定的值。
不定长特征解析:
tf.VarLenFeature(dtype)
- 注:可以不明确指定shape,但得到的tensor是SparseTensor。
- shape:可当
通过
tf.io.parse_single_example
对 1 中得到的raw_data进行解析。对解析后的数据,对应的部分进一步进行还原。
在解析TFRecord时,需要注意:
tf.io.FixedLenFeature
中要明确传入数据的形状。tf.io.VarLenFeature
虽然不用传入数据形状,但需要通过tf.sparse.to_dense
对对应数据进行解析- 其中由于tensor是前面是通过转换为字符类型进行存储的,因此需要进行解码。
1 | import tensorflow as tf |
Reference
https://zhuanlan.zhihu.com/p/33223782