Tfrecord与TF.image?

时间:2018-07-06 12:36:43

标签: tensorflow optimization training-data tfrecord

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

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

我过去这样做的方式是,我有一个单独的脚本,该脚本给出了对某些文件的引用,它将生成一个Tfrecord文件,其中包含数据扩充。例如,Tfrecord中的前 n 张图像是给定图像,然后对其进行随机转换等。然后,输入函数仅对每条记录进行解码,并指定批处理,混排等。

1 个答案:

答案 0 :(得分:1)

您可能会有这种印象,因为此输入格式是在tensorflow网站上提出的,它被指定为“ recommended format”甚至“ standard TensorFlow format”。

我认为TFRecord格式的主要优点是

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

但是,基于protobuf的格式本身并不是为性能而设计的。例如,标签以纯文本存储,并为每个记录重复-因此,TFRecord files may end up being much larger than plain-text csv files。数值的存储方式也不是为性能而设计的:用于编码值的位数不一定与输入类型匹配(例如,uint8可以根据其值使用一个或两个字节存储) ;更糟糕的是,negative integer values are stored using 10 (!) bytes no matter what

以我的经验,TFRecord文件从未对我的输入管道提供性能上的提升-充其量,它们与原始数据保持一致,大多数情况下它们导致性能稍差。另一方面,在tensorflow之外,该格式在很大程度上是未知的,即使在tensorflow内,您也需要花一点时间来read a single record to debug it

因此,除非您为可移植性而努力,否则您可以处理原始二进制数据而不必担心会遗漏太多。但是,如果文件很小,则可以考虑将多个样本分组在一个文件中以提高性能,或者使用更复杂的方法,例如HDF5。 (如果可移植性是一个问题,那么我仍然会考虑对HDF5进行基准测试,后者也是可移植的。)

最后,请不要误解您的问题。开发团队提出的TFRecord的优点是,您将从converting data to this format开始找到许多有关如何使用它的示例。