【问题标题】:TF Api Dataset: initializationTF Api 数据集:初始化
【发布时间】:2018-04-19 22:31:23
【问题描述】:

tf.dataset 工作得非常好,我能够将学习速度提高 2 倍。但是我仍然有性能问题,GPU 的利用率很低(尽管使用tf.dataset 和几个工人)。 我的用例如下:

  1. ~400 个训练样例,每个有 10 个输入通道(约 5GB)
  2. 任务是使用 ResNet50 进行分割。前后大约需要 0.15 秒。批量大小 = 32

  3. 数据加载速度很快,大约需要 0.06 秒。

但是在一个 epoch(400/32 ~= 13 次迭代)之后,数据加载大约需要 3.5 秒,就像加载器的初始化一样(它不仅仅是处理所有 epoch)。这使得学习非常缓慢。

我的问题是:是否有在每个 epoch 之后消除初始化的选项,只是不断地输入数据?

我试图设置dataset.repeat(10),但它没有帮助。

加载代码和火车在这里:https://gist.github.com/melgor/0e681a4fe8f125d25573aa30d8ace5f3

该模型只是将 ResNet 转换为 Ecnoder-Decoder 思想进行图像分割。大部分代码取自https://github.com/argman/EAST,但由于这里加载很慢,我想将其转换为TfRecords。

【问题讨论】:

  • 不看源头很难回答这样的问题。我最近一直在玩数据集,似乎 dataset.repeat() 是要走的路,而不是每次都重新初始化迭代器。但是你必须小心你在管道中的哪个位置执行repeat()。
  • 感谢您的回答。如果它对调试有用,我添加了一些代码。目前我不确定是否有任何方法可以解决此问题。
  • 感谢您的提示。不幸的是,它并没有更好地工作。目前我正在尝试压缩数据,也许然后重新初始化会更好。

标签: tensorflow dataset


【解决方案1】:

我通过长时间初始化部分解决了我的问题。我只是让 tge tfrecord 文件更小。 在我的基本实现中,我使用原始字符串作为图像(所以来自 numpy 数组的字符串)。新的“tfrecord”包含使用jpegpng 的压缩图像。多亏了它,它使文件缩小了 50 倍,从而使初始化速度更快。但它也有缺点:您的图像需要是 uini8 (jpeg) 或 uint16 (png)。如果是float,可以使用uint16,但是会丢失信息。

要将 numpy 数组编码为压缩字符串,您可以使用 Tensorflow 本身:

encoded_jpeg = tf.image.encode_jpeg(tf.constant(img),format='rgb').eval(session=sess)
encoded_png  = tf.image.encode_png(tf.constant(png_image)).eval(session=sess)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-06-14
    • 1970-01-01
    • 2018-01-12
    • 2020-05-18
    • 1970-01-01
    • 2012-06-05
    • 1970-01-01
    相关资源
    最近更新 更多