TensorFlow高效读取数据之TFrecord,可能是节省存储费用的好办法

点击上方“关注”,All in AI中国

机器学习和深度学习的核心支柱之一是训练模型时使用的数据,因为它们是算法能够归纳和创建相关模型的来源。在使用Tensorflow时,将数据提供给这些模型有好几种方法,但作者推荐的方法是使用TFRecord格式,该格式主要存储在映射中被结构化的数据字节数组。每一个映射都可以很容易地解释为一个特征或示例,它包含所有的相关信息,这些信息将在以后的训练和测试步骤中被使用。

TensorFlow高效读取数据之TFrecord,可能是节省存储费用的好办法

大多数关于TFRecord的帖子都是直接创建这些特征,而不需要对存储进行必要的保护。当作者试图使用TFRecord文件来处理图像时,作者遇到了有关存储大型文件的问题,因为那些TFRecord文件开始增长到原始数据大小的10倍,这使得在处理大型数据集时可能会变得非常令人烦恼。

链接文章中来自tensorflow库的封闭式问题清楚地显示了这种问题的存在(https://github.com/tensorflow/tensorflow/issues/9675),但也提供了一个非常有效的解决方案。因此,我们将在创建TFRecord特征之前对图像进行编码,而不是盲目地存储图像。

TensorFlow高效读取数据之TFrecord,可能是节省存储费用的好办法

(所有代码片段都基于一个可用的TFRecord构建脚本,可以在这个存储库中找到,(https://github.com/tinenbruno/image-tfrecord-builder它基于Kwot Sin工作。)

步骤1. 组织你的图像数据集

首先,我们需要组织我们的数据集,以便我们能更轻松地使用它。要做到这一点,其中一种方法是按照以下方式构建它:

TensorFlow高效读取数据之TFrecord,可能是节省存储费用的好办法

使用这种结构,它将支持我们进行简单地迭代文件夹,以收集有关于类名和图像路径的所有信息。

步骤2. 拆分你的数据集

我们将在你的数据集中创建两种类型的拆分。第一种类型会评估你的机器学习模型的核心,它是关于在训练和测试子集中拆分数据集的。如它名称所示,训练数据集将用于模型的训练步骤中,而测试数据集将会用于验证该模型。

TensorFlow高效读取数据之TFrecord,可能是节省存储费用的好办法

我们将创建的第二个拆分类型被用于训练和测试数据集的分片。分片可以加快你的阅读速度,值得注意的是,分片时通常不会使用超过千兆字节大小的文件。如果你的数据集将会变得非常大,这一点将会非常重要。

步骤3. 创建你的TFRecord文件

我们将对每个图像进行编码,使用OpenCV加载后将其作为特征存储在TFRecord文件中。 例如,使用cv2.imencode,我们可以将图像编码为JPEG。

TensorFlow高效读取数据之TFrecord,可能是节省存储费用的好办法

然后,我们可以简单地使用这个编码的图像字符串来生成代表我们特征的映射。由于我们的目标只是获得一个小记录,因此我们只会存储后续步骤中所需的最少信息。

TensorFlow高效读取数据之TFrecord,可能是节省存储费用的好办法

从TFRecords读取

作者还有一件重要的事情要说明:如何从TFRecord文件中读取。如前文所述,TFRecord以结构化的方式存储特征,在构建TFRecord文件时定义了存储方式。然后,从TFRecord文件中读取时,准确地了解正在读取的特征的结构是很重要的。如果你遵循这篇文章的示例,那么当你从TFRecord文件读取时,我们期望它被解析为如下内容:

TensorFlow高效读取数据之TFrecord,可能是节省存储费用的好办法

我们还需要解码JPEG编码的图像,可以使用以下方法完成:

TensorFlow高效读取数据之TFrecord,可能是节省存储费用的好办法

结论

最后,我们将获得一个TFRecord格式的数据集,其大小接近原始数据。考虑到与其训练时间相比,解码时间通常是无关紧要的,这可能是节省存储费用的一个很好的解决方案。

TensorFlow高效读取数据之TFrecord,可能是节省存储费用的好办法


分享到:


相關文章: