【问题标题】:resizing JPGs before creating `TFRecord` files?在创建“TFRecord”文件之前调整 JPG 的大小?
【发布时间】:2018-06-19 04:04:42
【问题描述】:

我正在构建一个与 tf.slim 一起使用的模型,它将针对 AVA 数据集运行 –– 32GB 大小,大约 256K JPG 图像。针对全分辨率图像,我创建了 20 个分片 TFRecord 文件用于训练,每个文件大小为 1.54 GB

在训练期间,我的预处理步骤会将每个图像的大小调整为 (256,256,3),然后随机抽取 (224,224,3)。如果我在创建 TFRecord 文件之前调整 JPG 图像的大小,文件大小会缩小到 28 MB

除了额外的时间,如果我在创建TFRecords 之前调整 JPG 文件的大小,我的方法是否还有其他问题?

【问题讨论】:

    标签: tensorflow tf-slim tfrecord


    【解决方案1】:

    不,这种方法没有问题,但如果您从性能方面讲,您不会看到创建调整大小的 TFRecord 带来的任何(显着)性能改进。 当然它会消耗更少的磁盘空间。

    如果我可以推荐 - 如果你有一个不错的存储设备(不一定是 SSD)并且你正确地管理你的数据输入管道(预取足够的下一个数据样本),TFRecords 不会提供比处理更好的性能使用单个图像文件,并减少头痛和开销。

    【讨论】:

    • 我很好奇你为什么认为没有性能改进?您是否将所有内容都加载到内存中?你是如何测试性能的?
    • 我认为在我自己的输入管道中测试它没有性能。我没有将所有内容都加载到内存中,但我确实预取了接下来的约 1000 个样本(在我的情况下这已经足够了——这个数字对于每个目的来说都不够通用)。我通过比较每秒处理的输入样本数来测试性能。
    • 为什么您认为您不会看到性能改进?在没有预调整大小的情况下,在训练期间的每个批次和每个时期,图像都将以全尺寸加载,然后会发生计算量大的调整大小操作。尝试使用预调整为 64x64 的图像与将 1024x1024 图像调整为 64x64 的数据加载器对单个 epoch 进行计时。
    【解决方案2】:

    对于大型数据集而言,这似乎是一种明智的方法。

    来自 TensorFlow 文档:https://www.tensorflow.org/performance/performance_guide

    读取大量小文件会显着影响 I/O 表现。获得最大 I/O 吞吐量的一种方法是 将输入数据预处理为更大的 (~100MB) TFRecord 文件。对于较小的 数据集(200MB-1GB),最好的方法通常是加载整个 数据集到内存中。文档下载并转换为 TFRecord 格式包括用于创建的信息和脚本 TFRecords 和此脚本将 CIFAR-10 数据集转换为 TFR 记录。

    这是否会提高训练性能(如速度)可能取决于您的设置。特别是对于带有 GPU 的本地设置(请参阅 Matan Hugi 的回答)。 (我自己没有做过任何性能测试)

    预处理只需要进行一次,如有必要,您可以在云中运行它。当您的 GPU 变得更快时,它更有可能成为瓶颈,例如你通过谷歌的机器学习引擎和更强大的 GPU 运行它(除非你自己可以使用更快的 GPU)或者 I/O 变得更慢(例如涉及网络)。

    总结一些优点:

    • 预处理只进行一次
    • 预处理可以在云端运行
    • 减少瓶颈(如果有的话)

    不过,您还有额外的步骤。

    在您的情况下,20x 28MB 应该很容易放入内存中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-10-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多