tf.dataset
真的很棒,我能把学习速度提高2倍。但我仍然有性能问题,GPU的利用率很低(尽管有几个工人使用tf.dataset
)。我的用例如下:
- ~400个训练示例,每个示例有10个输入通道(取~5GB)
-
任务是使用ResNet50进行分割。前后耗时约0.15s。批次大小=32
-
数据加载很快,大约需要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"包含使用jpeg
或png
的压缩图像。正因为如此,它使文件缩小了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)