tf.dataset
的确非常有效,我能够加速学习~2倍。但我仍然存在性能问题,GPU的利用率很低(尽管tf.dataset
使用了几个工作者)。
我的用例如下:
任务是使用ResNet50进行细分。向前 - 向后需要~0.15s。批量大小= 32
数据加载速度快,需要~0.06s。
但是在一个纪元(400 / 32~ = 13次迭代)之后,数据加载需要~3.5秒,与加载器的初始化相同(它不仅仅是处理所有纪元)。这使学习变得非常缓慢。
我的问题是:是否有选项可以在每个纪元后消除初始化,只是连续提供数据?
我试图设置dataset.repeat(10)
,但没有任何帮助。
加载代码和列车位于:https://gist.github.com/melgor/0e681a4fe8f125d25573aa30d8ace5f3
该模型只是将ResNet转换为Ecnoder-Decoder的图像分割理念。大部分代码都取自https://github.com/argman/EAST,但由于此处加载非常慢,我想将其转换为TfRecords。
答案 0 :(得分:0)
我部分解决了长时间初始化的问题。我只是让tge tfrecord
文件更小。
在我的基本实现中,我使用原始字符串作为图像(因此来自numpy数组的字符串)。新的' tfrecord'包含使用jpeg
或png
的压缩图像。由于它使文件小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)