问题引入

在深度学习中,一个好的数据集必不可少。在使用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格式文件的读取。谢谢大家。

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐