前言:本文詳細介紹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文件,參見下一篇文章。