TF Api数据集:初始化

时间:2017-11-07 13:36:49

标签: tensorflow dataset

tf.dataset的确非常有效,我能够加速学习~2倍。但我仍然存在性能问题,GPU的利用率很低(尽管tf.dataset使用了几个工作者)。 我的用例如下:

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

  3. 数据加载速度快,需要~0.06s。

  4. 但是在一个纪元(400 / 32~ = 13次迭代)之后,数据加载需要~3.5秒,与加载器的初始化相同(它不仅仅是处理所有纪元)。这使学习变得非常缓慢。

    我的问题是:是否有选项可以在每个纪元后消除初始化,只是连续提供数据?

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

    加载代码和列车位于:https://gist.github.com/melgor/0e681a4fe8f125d25573aa30d8ace5f3

    该模型只是将ResNet转换为Ecnoder-Decoder的图像分割理念。大部分代码都取自https://github.com/argman/EAST,但由于此处加载非常慢,我想将其转换为TfRecords。

1 个答案:

答案 0 :(得分:0)

我部分解决了长时间初始化的问题。我只是让tge tfrecord文件更小。 在我的基本实现中,我使用原始字符串作为图像(因此来自numpy数组的字符串)。新的' tfrecord'包含使用jpegpng的压缩图像。由于它使文件小50倍,使初始化更快。但也有它的缺点:你的图像需要是uini8(jpeg)或uint16(png)。如果是浮动,你可以使用uint16,但会丢失信息。

要将numpy数组编码为压缩sting,您可以使用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)