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类型。