【问题标题】:Tfrecord vs TF.image?Tfrecord vs TF.image?
【发布时间】:2018-07-06 12:36:42
【问题描述】:

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

  1. 创建 Tfrecord 文件有什么好处,还是直接在输入函数中解码和准备每个样本(而不是让输入函数简单地解码 Tfrecord)同样有效?
  2. 如上例在输入函数中使用直接原始文件时,您会在哪里添加数据增强步骤?

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

【问题讨论】:

    标签: tensorflow optimization training-data tfrecord


    【解决方案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 开始。

    【讨论】:

    • 感谢您的详尽回答。数据增强呢?离线执行所有这些并将每个样本的增强变体保存在 Tfrecord 中是否有意义?我这里的想法是,虽然这种方式会占用很多额外的磁盘空间,但是扩充都是离线完成的,因此在训练时不会争抢资源。
    • @rodrigo-silveira 有趣的问题,与文件格式完全正交。如果你在 GPU 上训练,你通常会在 CPU 上进行增强,它通常不会显着影响性能。我会考虑只为非常苛刻的增强保存预处理输入。
    猜你喜欢
    • 2021-04-23
    • 2020-02-21
    • 1970-01-01
    • 1970-01-01
    • 2018-01-12
    • 1970-01-01
    • 2017-01-27
    • 2018-10-29
    • 2018-06-19
    相关资源
    最近更新 更多