如何制作并读取TFrecord格式的数据集(一)
问题引入在深度学习中,一个好的数据集必不可少。在使用tensorflow进行图像分类任务中,往往不少同学都是直接从硬盘直接加载图片,在内存进行预处理等工作后,直接输入给网络进行训练。如果你的数据集比较小,这种方式对你的内存不会造成太大的负担,代码跑起来速度还可以,可是当你的数据集特别大的时候,再从硬盘加载图片到内存进行训练,就显得特别吃力了。这个时候我们就需要用到tensorflow建议使用的统.
问题引入
在深度学习中,一个好的数据集必不可少。在使用tensorflow进行图像分类任务中,往往不少同学都是直接从硬盘直接加载图片,在内存进行预处理等工作后,直接输入给网络进行训练。如果你的数据集比较小,这种方式对你的内存不会造成太大的负担,代码跑起来速度还可以,可是当你的数据集特别大的时候,再从硬盘加载图片到内存进行训练,就显得特别吃力了。这个时候我们就需要用到tensorflow建议使用的统一数据格式TFrecord.
TFrecord数据格式简介
对于tensorflow新手来说,我们不用详细去了解TFrecord格式到底是怎么回事。我们只需要知道以下几点:
1.TFrecord格式的文件能存储图片的信息
TFrecord格式的文件可以存储我们数据集的信息,比如说图片的长、宽、通道数、标签、数据、图片名等等,我们根据自己的需要保存信息就可以。一般来说,我们保存图片的长、宽、通道数、数据、标签。
2.将图片信息转化为TFrecord的格式可以加快数据提取的速度
3.TFrecord格式的数据便于储存,移动等
问题解决
1.首先构建一个tf.Example消息准备写入TFrecord文件
# The following functions can be used to convert a value to a type compatible
# with tf.Example.
def _bytes_feature(value):
"""Returns a bytes_list from a string / byte."""
#接受bytes类型的文件
if isinstance(value, type(tf.constant(0))):
value = value.numpy() # BytesList won't unpack a string from an EagerTensor.
return tf.train.Feature(bytes_list=tf.train.BytesList(value=[value]))
def _float_feature(value):
"""Returns a float_list from a float / double."""
return tf.train.Feature(float_list=tf.train.FloatList(value=[value]))
def _int64_feature(value):
"""Returns an int64_list from a bool / enum / int / uint."""
return tf.train.Feature(int64_list=tf.train.Int64List(value=[value]))
def serialize_example(filename,image_buffer,label,text,height,width,colorspace,e):
#创造一个字典将特征名映射到tf.Example的字典
feature={'image/height': _int64_feature(height),
'image/width': _int64_feature(width),
'image/colorspace': _bytes_feature(tf.compat.as_bytes(colorspace)),
'image/channels': _int64_feature(channels),
'image/class/label': _int64_feature(label),
'image/class/text': _bytes_feature(tf.compat.as_bytes(text)),
'image/filename': _bytes_feature(tf.compat.as_bytes(os.path.basename(filename))),
'image/encoded': _bytes_feature(tf.compat.as_bytes(image_buffer))}
#构建消息
example_proto=tf.train.Example(features=tf.train.Features(feature=feature))
#.SweializeToSting方法将所有原始信息转化为二进制字符串
return example_proto.SerializeToString()
在使用上述的函数之前,我们假设你已经得到了 图片的各种属性特征height(128),width(128),colorspace(‘RGB’),channels(3),label(0),text(‘dog’),filename("data/dog/dog1.jpg’),encoded(图片信息).
我们不能直接将上述信息直接写到feature字典的值中,因为tf.train.Feature消息只接受以下三种类型的数据:
所以我们采用上面的三个类型转化函数将图片信息转化为TFrecord要求的格式,再写进feature。
2.将tf.Example消息写进TFrecord文件
通过第一步我们已经构造好了含有图片信息的tf.Example消息,这一步我们只需要将消息写进文件中就可以。
代码如下:
#outputfile为存储tfrecord文件的文件夹
with tf.io.TFRecordWriter(outputfile) as writer:
for i in range(n_observations):
example = serialize_example(filename,image_buffer,label,text,height,width,colorspace,encoded)
writer.write(example)
writer.close()
通过上述代码我们就可以将信息写入TFrecord文件,到此,我们可以成功地制作出属于自己的TFrecord格式的数据集。
欢迎大家和我一起交流,下一节我们讲解TFrecord格式文件的读取。谢谢大家。

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐
所有评论(0)