TensorFlow的數據pipeline系列:tf.train.Example和tf.train.SequenceExample協議的比較(三)

前言:本文詳細介紹tf.train.Example和tf.train.SequenceExample的區別,前面的幾篇文章參見:

tensorflow的Data Pipeline系列教程(一)——Dataset類的屬性即常用方法

TensorFlow的數據pipeline系列:Datasets+TFRecord的數據導入(二)

TensorFlow之tfrecords文件詳細教程

一、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文件,參見下一篇文章。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章