TF Api数据集:初始化



tf.dataset真的很棒,我能把学习速度提高2倍。但我仍然有性能问题,GPU的利用率很低(尽管有几个工人使用tf.dataset)。我的用例如下:

  1. ~400个训练示例,每个示例有10个输入通道(取~5GB)
  2. 任务是使用ResNet50进行分割。前后耗时约0.15s。批次大小=32

  3. 数据加载很快,大约需要0.06s。

但在一个历元(400/32~=13次迭代)后,数据加载需要大约3.5秒,与加载程序的初始化相同(它比处理所有历元都要多)。这使得学习非常缓慢。

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

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

装货代码和列车在这里:https://gist.github.com/melgor/0e681a4fe8f125d25573aa30d8ace5f3

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

我部分解决了长初始化的问题。我只是把tgetfrecord文件做得更小。在我的基本实现中,我使用原始字符串作为图像(因此使用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)

最新更新