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文件,参见下一篇文章。

 

 

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值