【发布时间】:2018-01-13 13:59:11
【问题描述】:
以下代码中的shuffle 步骤对于中等大小的buffer_size(比如1000)运行非常缓慢:
filenames = tf.constant(filenames)
dataset = tf.data.Dataset.from_tensor_slices((filenames, labels))
dataset = dataset.map(_parse_function)
dataset = dataset.batch(batch_size)
dataset = dataset.shuffle(buffer_size)
如果我们使用numpy来打乱数据,代码如下:
idx = np.arange(len(filenames))
np.random.shuffle(idx)
new_filenames = [filenames[i] for i in idx]
next_batch_filenames = new_filenames[:batch_size]
# get the corresponding files in batch
这要快得多。我想知道 TF 是否除了简单地打乱数据之外还做了其他事情。
【问题讨论】:
-
你对慢的定义是什么?同样在您的 TensorFlow 代码中加载文件,而您的 numpy 示例没有。也可能是相关的:github.com/tensorflow/tensorflow/issues/14857
-
我没有计时,但 TF 的版本明显慢了很多。我的 numpy 块中的最后一行用于将文件放入内存并将它们转换为 TF 格式。但是谢谢链接。
-
在洗牌后尝试使用预取选项。它应该使加载更快。例如:dataset.prefetch(buffer_size=10)
-
我的理解是,TensorFlow shuffle 实际上会复制元素,如果你没有足够的 RAM 来保存它们,这些元素会变得非常缓慢。
-
2019 年,tf 1.14 cuda 10,训练集 84519 个样本,调整大小(224,224,3 from 512 x694)作为预处理中的唯一操作,批量大小为 16 tf.data.Dataset。 shuffle(len(train_files)) 在 GTX 1080 8GB GPU、Intel core i7 7820 HK 8 核 CPU 中需要 1 小时 5 分钟,开始准备数据需要大约 1 小时。
标签: tensorflow