Tfrecord 与 TF.image?

Tfrecord vs TF.image?

我的印象是拥有一个预先计算的 Tfrecord 文件是输入函数的最有效方式。但是,我一直看到 great looking articles such as this one 输入函数引用磁盘上的原始文件,并在现场进行解码。

  1. 创建 Tfrecord 文件是否有好处,或者在输入函数内解码和准备每个样本是否同样有效(与让输入函数简单地解码 Tfrecord 相比)?
  2. 当如上例所示在输入函数中使用直接原始文件时,您将在哪里添加数据扩充步骤?

我过去这样做的方式是我有一个单独的脚本,如果引用一些文件,它会生成一个 Tfrecord 文件,其中包含数据扩充。例如,Tfrecord 中的前 n 个图像是给定的图像,然后对其进行随机变换等。然后输入函数简单地解码每个记录并指定批处理、混洗等.

你可能会有这样的印象,因为这种输入格式是在tensorflow网站上提出的,它被指定为“recommended format” , or even the “standard TensorFlow format”。

在我看来,TFRecord 格式的主要优点是

  1. 它首先获得了 tensorflow 的公民支持,class 具有读取和解码它的专用功能,
  2. 它是一种灵活的格式,可以将多个不同类别的数据存储在一起,而不仅仅是图像,
  3. 它可以存储多条记录,
  4. 它是便携式的。

然而,基于 protobuf 的格式本身并不是为性能而设计的。例如,标签以纯文本形式存储,并为每条记录重复——因此,TFRecord files may end up being much larger than plain-text csv files. The way numerical values are stored is also not designed for performance: the number of bits used to encode a value does not necessarily match the input type (e.g. a uint8 may be stored using one or two bytes depending on its value); worse, negative integer values are stored using 10 (!) bytes no matter what.

根据我的经验,TFRecord 文件从未为我的输入管道提供性能提升——充其量,它们与原始数据相当,大多数时候它们会导致性能稍差。另一方面,在 tensorflow 之外,这种格式在很大程度上是未知的,即使在 tensorflow 中,您也需要挠头才能 .

因此,除非您力求可移植性,否则您可以处理原始二进制数据而不用担心遗漏太多;但是,如果您的文件非常小,请考虑将多个样本分组到一个文件中以提高性能,或者使用更精细的内容,例如 HDF5。 (如果可移植性 一个问题,那么我仍然会考虑针对 HDF5 进行基准测试,它也是可移植的)。

最后,不要把我的话当成理所当然,不要把基准格式当成你的问题。开发团队提出的 TFRecord 的优点是您会找到许多有关如何使用它的示例,从 converting data to this format.

开始