Tensorflow-TFRecord文件

Tensorflow官方对数据读取提供了三种方式

1.预加载数据:即提供运行python代码,使用python代码提供数据

2.填充数据:使用placeholder占位符,再使用feed_dict将数据喂入占位符中

3.通过文件读取数据:直接从文件中读取;通过队列管理器从文件中读取数据。

TFRecord就属于方式3。TFRecord数据文件是一种将图像数据和标签统一存储的二进制文件,能更好的利用内存,在tensorflow中快速的复制,移动,读取,存储等。

TFRecord文件的使用分为两步:

1.先将非规范化的数据写入TFRecord二进制文件中(若没有该文件则新建一个TFRecord文件)

2.对TFRecord文件从队列中进行读取

这么操作的意义就在于:直接对未规范化的数据进行操作,由于不具有规范性,拓展性差、操作复杂等等的劣势,所以先将数据进行转化、规范化,存储进TFRecord二进制文件中,之后再对TFRecord文件中的数据进行操作,具有更高的拓展性,同时也更有效率。

关于TFRecord文件的写入:

首先明确TFRecord文件中存放着所有图像数据对应的Protocol Buffer数据的实例。也就是说TFRecord文件中存放着很多个实例,每个实例都是Protocol Buffer类型的数据。而每个实例在TFRecord中都是固定格式的,这个格式通过一个structure(在OOP中对应的是类)来定义,这就是TFRecord统一格式的方式。

TFRecord给定的类的格式:

tf.train.Example中包含了属性名称到取值的字典,其中属性名称为字符串,属性的取值可以为字符串(BytesList)、实数列表(FloatList)或者整数列表(Int64List)。

message Example {

 Features features = 1;

};

message Features{

 map<string,Feature> featrue = 1;

};

message Feature{

    oneof kind{

        BytesList bytes_list = 1;

        FloatList float_list = 2;

        Int64List int64_list = 3;

    }

};

所以将格式化前的数据写入TFRecord文件中,需要先将数据格式化,首先将原始未格式化的数据转化为TFRecord给定的类的形式,即将数据信息存入类(数据结构)当中,之后再将其转化为Protocol Buffer的形式,即转化为二进制数据,最后将其转化为字符串的形式,写入TFRecord文件中。

根据以下代码进行详细解读:

for index in range(num_examples)

    example  = tf.train.Example(features=tf.train.Features(feature={

        ‘pixels’: _init64_feature(pixels),

        ‘label’: _init64_feature(np.argmax(labels[index])),

        ‘image_raw’: _bytes_feature(image_raw)}))

    writer.write(example.SerializeToString())

writer.close()

这里的features是类Example的一个参数,通过向tf.train.Example()方法传入features参数来创建一个Example类的实例。所以这里的操作步骤如下:

1.先将原始数据中具有的Example的参数features所需要的信息提取出来,并按照参数features的格式要求存储。

2.将提取出的并且打包好的信息通过tf.train.Features()转化为Protocol Buffer格式,并赋予类Example的参数features。

3.向tf.train.Example()函数传递参数features,该函数会创造一个类Example的实例,并将其转化为Protocol Buffer格式。

这个tf.train.Features()以及tf.train.Example()都将数据转化为Protocol Buffer类型。

猜你喜欢

转载自blog.csdn.net/weixin_39721347/article/details/86368430