我的印象是,拥有预先计算的Tfrecord文件是提供输入功能的最有效方法。但是,我一直看到great looking articles such as this one处的输入函数引用了磁盘上的原始文件,并当场进行解码。
我过去这样做的方式是,我有一个单独的脚本,该脚本给出了对某些文件的引用,它将生成一个Tfrecord文件,其中包含数据扩充。例如,Tfrecord中的前 n 张图像是给定图像,然后对其进行随机转换等。然后,输入函数仅对每条记录进行解码,并指定批处理,混排等。>
答案 0 :(得分:1)
您可能会有这种印象,因为此输入格式是在tensorflow网站上提出的,它被指定为“ recommended format”甚至“ standard TensorFlow format”。
我认为TFRecord格式的主要优点是
但是,基于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开始找到许多有关如何使用它的示例。