Tensorflow Tfrecord vs.TF.image?

Tensorflow Tfrecord vs.TF.image?,tensorflow,optimization,training-data,tfrecord,Tensorflow,Optimization,Training Data,Tfrecord,我的印象是,拥有一个预先计算好的Tfrecord文件是输入函数的最有效的方式。然而,我一直看到输入函数引用磁盘上的原始文件,并当场进行解码 创建Tfrecord文件是否有好处,或者在输入函数内部解码和准备每个样本是否同样有效(而不是让输入函数简单地解码Tfrecord) 在上面的示例中,在输入函数中使用直接原始文件时,您将在何处添加数据扩充步骤 我在过去这样做的方式是,我有一个单独的脚本,给定对一些文件的引用,它将生成一个Tfrecord文件,其中包含数据扩充。例如,Tfrecord中的前n个图

我的印象是,拥有一个预先计算好的Tfrecord文件是输入函数的最有效的方式。然而,我一直看到输入函数引用磁盘上的原始文件,并当场进行解码

  • 创建Tfrecord文件是否有好处,或者在输入函数内部解码和准备每个样本是否同样有效(而不是让输入函数简单地解码Tfrecord)
  • 在上面的示例中,在输入函数中使用直接原始文件时,您将在何处添加数据扩充步骤

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

    您可能会有这种印象,因为这种输入格式是在tensorflow网站上提出的,在那里它被指定为“”或甚至是“”

    在我看来,TFRecord格式的主要好处是

  • 它获得tensorflow一流的市民支持,具有专门的读取和解码功能
  • 它是一种灵活的格式,可以存储多个不同类别的数据,而不仅仅是图像
  • 它可以存储多条记录
  • 它是便携式的
  • 然而,基于protobuf的格式本身并不是为了性能而设计的。例如,标签以纯文本形式存储,并对每个记录重复——因此,。存储数值的方式也不是为了性能而设计的:用于编码值的位数不必与输入类型匹配(例如,
    uint8
    可以根据其值使用一个或两个字节进行存储);更糟糕的是

    在我的经验中,TFREST文件从来没有给我的输入管道提供性能提升——充其量,它们与原始数据保持一致,大多数时候它们的性能稍微差一些。另一方面,格式在TunSoFalm之外很大程度上是未知的,甚至在TySoFrof中,你也需要从头到点。>

    因此,除非您为可移植性而努力,否则您可以在不丢失大量数据的情况下对原始二进制数据进行处理;但是,如果您的文件非常小,则考虑将单个示例中的几个示例分组以用于性能,或者使用更为详细的方法,例如。(如果便携性是一个问题,那么我仍然会考虑对HDF5的基准测试,这也是可移植的)。


    最后,不要将我的话视为理所当然,也不要将你的问题视为基准格式。开发团队提出的TFRecord的优点是,你会发现许多关于如何使用它的示例,首先是。

    感谢你详尽的回答。数据扩充呢?离线执行所有这些操作并保存是否有意义Tfrecord中每个样本的增强变体?我的想法是,尽管这种方法会占用大量额外的磁盘空间,但增强都是离线完成的,因此在培训期间不会争夺资源。@rodrigo silveira有趣的问题,与文件格式非常正交。如果您在GPU上培训,您会通常在CPU上做扩充,它通常不会以显著的方式影响性能。我会考虑只保存预处理的输入,仅用于非常苛刻的扩充。