1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > 利用Tensorflow中的TFRecord生成与读取图片

利用Tensorflow中的TFRecord生成与读取图片

时间:2021-07-18 19:51:50

相关推荐

利用Tensorflow中的TFRecord生成与读取图片

本人是深度学习的爱好者,最近在参加cv的表情识别训练,把一些步骤和过程记录下来

一.什么是TFRecord

对于计算机的内存来说,我们训练集样本的数目是巨大的,而且这些文件分散在不同的文件夹中,在存读取的过程中会耗费大量的时间和硬盘资源,此时就需要我们用TFRecord的储存格式来帮助存储数据。

protuBuf

TFRecord使用了名为“Protocol Buffer”二进制数据编码方案,它一次性只加载一个二进制文件,在训练数据很多的时候十分方便快捷。并且我们可以对不同的文件夹下的子文件分别生成TFRecord,十分方便。

二.声明tfRecord

首先我们要生成一个TFRecord形式的实例

writer=tf.python_io.TFRecordWriter(filename)image=Image.open(filename)

然后将图片转化为TFRecord存入特征需要的二进制格式,因为人脸训练表情分为图像和分类标志两类,所以分别以bytesList和Int64List的形式存储到feature参数中(feature是字典格式),最后将其序列化转换为字符串,写入TFRecord中。

image_bytes=image.tobytes()features={}features['image']=tf.train.Feature(bytes_list=tf.train.BytesList(value=[image_bytes]))features['label']=tf.train.Feature(int64_list=tf.train.Int64List(value=[int(label_list[i])]))tf_features=tf.train.Features(feature=features)tf_example=tf.train.Example(features=tf_features)tf_serialized=tf_example.SerializeToString()writer.write(tf_serialized)writer.close()

三.对生成的TFRecord文件进行解析

解析函数中首先要对对存入的feature进行分别提取,用tf.FixedLenFeature送入一个字典中

dics={}dics['label']=tf.FixedLenFeature((),dtype=tf.int64,default_value=0)dics['image']=tf.FixedLenFeature((),dtype=tf.string,default_value="")

生成字典后,我们就可以用tf中自带的parse_single_example提取指定字典中的数据

parsed_example=tf.parse_single_example(serialized=example_proto,features=dics)

对于int64类型的label数据,我们可以直接用parsed_example函数将数据取出,对于图片,由于我们一开始将其转换成为了二进制数据的原因,此时我们需要用解码函数decode_raw将其恢复

image=tf.decode_raw(parsed_example['image'],out_type=tf.uint8)label=parsed_example['label']

四.读取数据

取出数据以后,我们就可以通过函数来实现数据生成器

dataset=tf.data.TFRecordDataset(filenames=filenames)new_dataset=dataset.map(A)

其中A是我们生成的解析函数名,对于指定生成的dataset生成器,我们可以对其指定batch、prefetch的操作

shuffle()对生成器进行打乱prefetch(1)对生成器进行并行CPU处理,为GPU处理准备数据make_one_shot_iterator()获得生成器迭代器

next_element=iterator.get_next() 获得下一个迭代器

最后,我们在session中run这个返回的迭代器即可获得我们想要的输入图片和label(由于我们的字典中有两个key,所以要用list把这两个迭代器中的元素括起来,分别计算和赋值)

batch_images,batch_labels=sess.run([next_element[0],next_element[1]])

(个人思路记录,勿喷)

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。