我用 Dataset API 方法替换了项目中的 CIFAR-10 预处理管道,导致性能下降约 10-20%。
预处理是相当标准的: - 从磁盘读取图像 - 随机/裁剪和翻转 - 随机播放,批处理 - 输入模型
总的来说,我看到批处理现在快了 15%,但是每隔一段时间(或者,更准确地说,每当我重新初始化数据帧或期望重新洗牌时)批处理被阻塞了很长时间(30 秒),总时间变慢- 每 epoch 处理。
这种行为似乎与内部散列有关。如果我在 ds.shuffle(buffer_size=N) 中减少 N 延迟会更短,但成比例地更频繁。将所有结果中的 shuffle 移除以延迟,就好像 buffer_size 设置为数据集大小一样。
在读取/缓存方面,有人可以解释 Dataset API 的内部逻辑吗?是否有任何理由期望 Dataset API 比手动创建的队列工作得更快?
我正在使用 TF 1.3。