前言:本文详细介绍tf.train.Example和tf.train.SequenceExample的区别,前面的几篇文章参见:
tensorflow的Data Pipeline系列教程(一)——Dataset类的属性即常用方法
TensorFlow的数据pipeline系列:Datasets+TFRecord的数据导入(二)
一、tf.train.Example的使用
前面的例子中已经介绍了很多关于Example的使用,比如我有下面的数据
X=[ [1.0,2.0,3.0,4.0] , [5.0,6.0,7.0,8.0] ,[11.0,12.0,13.0,14.0] ,[20.0,21.0,22.0,23.0] ]
Y=[[1],[2],[3],[4]]
一共有四组样本,X的形状为4x4,Y的形状为4X1,下面有下面的代码来保存为tfrecords文件
def generate_tfrecords():
X=[[1.0,2.0,3.0,4.0],[5.0,6.0,7.0,8.0],[11.0,12.0,13.0,14.0],[20.0,21.0,22.0,23.0]]
Y=[[1],[2],[3],[4]]
writer = tf.io.TFRecordWriter('example.tfrecord') # 这是tf2.x版本
for i in tqdm(range(len(Y))): # 对于每个样本
y = Y[i]
x = X[i]
# 第一步:构造各个Feature
# 构造一个关于Y的feature
y_feature = tf.train.Feature(int64_list=tf.train.Int64List(value=y)) # value的值必须是列表,这里y已经是列表的
# 构造一个关于X的featurelist,每一个元素是一个list
x_feature = tf.train.Feature(float_list=tf.train.FloatList(value=x)) # value的值必须是列表,这里x已经是列表的
# 第二步:将各个Feature组合成一个Features
features = tf.train.Features(feature = {"X":x_feature,"Y":y_feature})
# 第三步:将Features组合成一个Example
example = tf.train.Example(features=features)
serialized = example.SerializeToString()
writer.write(serialized) # 写入文件中
print('records 文件保存完毕.') # 保存结束之后会得到一个 example.tfrecord 文件
writer.close()
注意:遵循“三步走”原则!参见前面的文章
二、tf.train.SequenceExample使用
def generate_tfrecords():
# 创建文件
writer = tf.io.TFRecordWriter('sequence_example.tfrecord')
# 非序列数据,即每一个元素长短是固定的
Y = [1, 2, 3, 4, 5, 1, 2, 3, 4]
# 长度不固定的序列
X = [[1.0], [2.0, 2.0], [3.0, 3.0, 3.0], [4.0, 4.0, 4.0, 4.0], [5.0, 5.0, 5.0, 5.0, 5.0],
[1.0], [2.0, 2.0, 3.0], [4.0, 4.0, 4.0, 4.0],[6.0,7.0,8.0]]
for i in tqdm(range(len(Y))): # 对于每个样本
y = Y[i]
x = X[i]
# 第一步:构造各个Feature
# 非序列化数据,构造一个feature
y_feature = tf.train.Feature(int64_list=tf.train.Int64List(value=[y])) # 必须包装成list形式
# 序列化数据,构造一个featurelist,每一个元素是一个Feature,
x_feature = tf.train.FeatureList(feature= [tf.train.Feature(float_list=tf.train.FloatList(value = [x_])) for x_ in x]) # x_必须包装成列表的形式
# 第二步:构造Features和FeatureLists
features = tf.train.Features(feature={"Y": y_feature})
featurelists = tf.train.FeatureLists(feature_list={"X": x_feature})
# 第三步:构造一个Example
# 构造一个example,来存放一组样本
sequence_example = tf.train.SequenceExample(
# context 来放置非序列化部分
context=features,
# feature_lists 放置变长序列
feature_lists=featurelists
)
serialized = sequence_example.SerializeToString() # 对没一个样本进行序列化,所以实际上每一个元素就是serialized
writer.write(serialized) # 写入文件中
print('records 文件保存完毕.')
writer.close()
三、再谈Feature、Features、FeatureList、FeatureLists
详情参见下面的总结
(1)Feature
feature_1 = tf.train.Feature(int64_list=tf.train.Int64List(value=[...])) # 必须包装成list形式
feature_2 = tf.train.Feature(float_list=tf.train.FloatList(value=[...])) # 必须包装成list形式
feature_3 = tf.train.Feature(bytes_list=tf.train.BytesList(value=[...])) # 必须包装成list形式
总结:参数是以下三者之一:int64_list、float_list、bytes_list
(2)Features
features = tf.train.Features(feature = {"X":x_feature,"Y":y_feature})
总结:参数是feature,接受的之是一个由feature组成的字典
(3)FeatureList
featurelist = tf.train.FeatureList(feature= [tf.train.Feature(float_list=tf.train.FloatList(value = [x_])) for x_ in x]) # x_必须包装成列表的形式
总结:参数是feature,接受的之是一个由多个feature组成的列表
(4)FeaturesLists
featurelists = tf.train.FeatureLists(feature_list={"X": x_feature})
总结:参数是feature_list,接受的之是一个由多个featurelist组成的字典
(5)Example
example = tf.train.Example(features=features)
总结:参数是features对象,
(6)SequenceExample
sequence_example = tf.train.SequenceExample(
# context 来放置非序列化部分
context=features,
# feature_lists 放置变长序列
feature_lists=featurelists
)
总结:参数context,接受是features对象,
参数feature_lists,接受feature_lists参数
关于如何解析tfrecord文件,参见下一篇文章。