我的印象是有一个预先计算的Tfrecord文件是给您输入函数的最有效的方式。但是,我一直看到像这一篇这样好看的文章,其中输入函数引用磁盘上的原始文件,并当场进行解码。
我过去这样做的方式是,我有一个单独的脚本,如果引用某些文件,它将生成一个包含数据增强的Tfrecord文件,作为其中的一部分。例如,Tfrecord中的前n个图像是一个给定的图像,然后是它的随机转换等等。然后输入函数简单地解码每个记录并指定批处理、洗牌等。
发布于 2018-07-07 15:43:17
您可能有这样的印象,因为这种输入格式是在tensorflow网站上提出的,它被指定为“https://www.tensorflow.org/programmers_guide/datasets#basic_mechanics”,甚至是“https://www.tensorflow.org/versions/r1.0/programmers_guide/reading_data#file_formats”。
在我看来,TFRecord格式的主要好处是
然而,基于protobuf的格式本身并不是为了性能优先而设计的。例如,标签以纯文本形式存储,并对每条记录重复-因此,TFRecord文件可能最终会比纯文本csv文件大得多。。存储数值的方式也不是为了性能而设计的:用于编码值的位数不一定与输入类型相匹配(例如,一个uint8可以使用一个或两个字节存储,取决于它的值);更糟糕的是,负整数值使用10 (!)存储。不管是什么。
根据我的经验,TFRecord文件从未为我的输入管道提供性能提升--充其量,它们与原始数据持平,大多数情况下它们的性能略差一些。另一方面,这种格式在tensorflow之外很大程度上是不为人所知的,即使在tensorflow中,您也需要在读取一条记录来调试它上稍微挠头一下。
因此,除非您努力实现可移植性,否则可以使用原始二进制数据,而不必担心会丢失太多;但是,如果您的文件非常小,请考虑在单个文件中分组几个示例以提高性能,或者使用更精细的方法(如HDF5 )。(如果可移植性是一个问题,那么我仍然会考虑使用HDF5进行基准测试,这也是可移植的)。
最后,不要认为我的话是理所当然的和基准格式为您的问题。开发团队提出的TFRecord的优点是,从将数据转换为此格式开始,您将发现许多关于如何使用它的示例。
https://stackoverflow.com/questions/51210639
复制相似问题