【问题标题】:Tensorflow splitting dataset into training and testing causes bottleneck/slowTensorflow 将数据集拆分为训练和测试导致瓶颈/缓慢
【发布时间】:2020-12-16 15:31:41
【问题描述】:

我有一个数据集,当我使用ds = ds.map(process_path, num_parallel_calls=AUTOTUNE).prefetch(AUTOTUNE) 对其进行预处理时,该行的执行速度非常快。然后,当我尝试使用以下方法访问数据集的元素之一时:

for image, label in ds.take(1):
  print(image.shape)
  image = tf.squeeze(image)
  plt.imshow(image, cmap='gray')

加载需要一两秒钟;这是我的第一个问题:

预处理是否仅在访问数据集中的元素时在数据集上运行,而不是在我调用 ds.map(process_path,...) 时立即运行?

但是我的主要问题是,当我将数据集 ds 分成两部分(训练和测试)并尝试再次访问其中一个元素时,速度相当慢......就像慢了 20 倍。我把它分成两部分:

test_ds_size = int(image_count * 0.2)
train_ds = ds.skip(test_ds_size)
test_ds = ds.take(test_ds_size)

然后我尝试以与上述相同的方式访问它,但将 ds 替换为 train_ds;我的第二个问题是:

为什么这会慢得多,只是将它分成两部分?

还是我做错了什么……

非常感谢任何帮助。

【问题讨论】:

  • 如果没有其他数据集管道,就很难诊断。不过,您的第一个直觉是正确的:dataset.map 不会加载任何数据。

标签: python tensorflow machine-learning tensorflow2.0


【解决方案1】:

dataset.map 通过应用地图函数创建一个新数据集。
即使在循环中,当您执行dataset.take() 时,它也会以非常短的时间从指定的数字创建一个新数据集。
加载数据集后,您正在执行与tf.data 性能无关的其他操作。
您可以从下面的示例中进行检查。

import tensorflow as tf
from time import time

dataset = tf.data.Dataset.range(1, 100)
t1 = time()
dataset = dataset.map(lambda x: x + 1)
t2 = time()
print("Time taken for map : ", t2-t1)

t3 = time()
ds = dataset.take(50)
t4 = time()
list(ds.as_numpy_iterator())
print("Time taken for take() : ",t4-t3) 

Time taken for map :  0.013489961624145508
Time taken for take() :  0.0005645751953125

现在,让我们看看 take() 在一些操作之后所花费的时间。

dataset = tf.data.Dataset.range(1, 100)
t1 = time()
dataset = dataset.map(lambda x: x + 1)
t2 = time()
print("Time taken for map : ", t2-t1)

t3 = time()
ds = dataset.take(50)
list(ds.as_numpy_iterator())
t4 = time()
print("Time taken for take() after some operation : ",t4-t3)

Time taken for map :  0.00974416732788086
Time taken for take() after some operation :  0.017722606658935547 

可以按照您指定的方式从现有数据集中拆分训练数据和测试数据,但需要时间,因为它会遍历所有元素。

为训练和测试创建tf.data.Dataset 的理想方法是分别创建它,如here 所示。确保在训练和测试数据中正确分布数据集之前对数据进行混洗。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-02-27
    • 2022-06-25
    • 2021-05-08
    • 2019-05-01
    • 1970-01-01
    • 2019-12-11
    • 1970-01-01
    相关资源
    最近更新 更多