【问题标题】:No cache file written in TensorFlow datasetTensorFlow 数据集中没有写入缓存文件
【发布时间】:2020-11-07 15:02:42
【问题描述】:

我正在尝试管理一个不适合内存的大型图像数据集,同时需要一些特定的计算。目前,我的代码如下所示:

  files  = [str(f) for f in self.files]
  labels = self.categories
  batch_size= 32


  dataset = tf.data.Dataset.from_generator(
        lambda: zip(files, labels),
        output_types=(tf.string, tf.uint8),
        output_shapes=(tf.TensorShape([]), tf.TensorShape([]))
  )

  dataset = dataset.map(
        lambda x, y: tf.py_function(_parser, [x, y, category_count], [tf.float32, tf.uint8]),
        num_parallel_calls=tf.data.experimental.AUTOTUNE,
        deterministic=False)

  dataset.cache(filename='/tmp/dataset.tmp')

  if mode == tf.estimator.ModeKeys.TRAIN:
        dataset = dataset.shuffle(buffer_size=10*batch_size, reshuffle_each_iteration=True)

  dataset = dataset.batch(batch_size=batch_size, drop_remainder=False)

  if mode == tf.estimator.ModeKeys.TRAIN:
        dataset.repeat(None)
  else:
        dataset.repeat(1)

  dataset = dataset.prefetch(tf.data.experimental.AUTOTUNE)

_parser() 函数打开一个图像文件,进行一系列转换,并返回一个张量和一个 1-hot 编码向量。但是,缓存步骤似乎无法正常工作:

  • 在第 1 个 epoch 和后续 epoch 之间的计算时间没有显着改善
  • 在此过程中未创建缓存文件,尽管交换分区几乎已满 (~90%)

cache() 函数是否只有在内存和交换分区都已满时才创建文件?此外,我希望一次只读取batch_size 文件。但是,似乎在映射步骤中一次读取了所有文件。我应该考虑使用interleave()from_generator() 结合使用吗?或者我应该先批量处理文件,然后再映射它们?

【问题讨论】:

    标签: tensorflow2.0 tensorflow-datasets


    【解决方案1】:

    请注意,当数据集较小时,应使用 cache()。如果数据集很大(在您的情况下),RAM 将不足以缓存其内容,因此它不适合内存。您应该增加 RAM 的容量或采用其他方法来加快训练速度。

    训练速度变慢的另一个原因是使用 map() 函数时的预处理阶段。
    map() 方法对每个项目应用变换,而 apply() 方法对整个数据集应用变换.

    您可以使用interleave() 并保留map() 然后batch() 的相同顺序。
    您已经在使用线程,将num_parallel_calls 设置为tf.data.experimental.AUTOTUNE 可以充分利用可用的一切。

    你也可以标准化你的输入数据,然后cache,如果它不能再次放入内存,那么最好不要在大型​​数据集上使用cache

    您可以关注来自 TensorFlow 的 these 性能提示。

    如果您有多个工作人员/设备,它将帮助您加快培训速度。

    下面是示例插图,显示了使用多线程加载和预处理进行预取。

    【讨论】:

      猜你喜欢
      • 2018-06-05
      • 1970-01-01
      • 1970-01-01
      • 2012-04-11
      • 1970-01-01
      • 2022-01-04
      • 1970-01-01
      • 2021-09-08
      • 1970-01-01
      相关资源
      最近更新 更多