【问题标题】:How can I shuffle a whole dataset with TensorFlow?如何使用 TensorFlow 打乱整个数据集?
【发布时间】:2017-06-28 02:37:40
【问题描述】:

现在我使用以下函数进行洗牌

from tensorflow.contrib import data
def input_pipeline(filenames, batch_size):
    # Define a `tf.contrib.data.Dataset` for iterating over one epoch of the data.
    dataset = data.TextLineDataset(filenames)
    dataset = dataset.map(decode_func)
    dataset = dataset.shuffle(buffer_size=10000)  # Equivalent to min_after_dequeue=10000.
    dataset = dataset.batch(batch_size)

    # Return an *initializable* iterator over the dataset, which will allow us to
    # re-initialize it at the beginning of each epoch.
    return dataset.make_initializable_iterator() 

但它只会以buffer_size 的数量对数据进行洗牌,并将按订单填充buffer

我的数据很大,我无法将buffer_size 设置得太大。有没有其他解决方案我可以洗牌整个数据集?

【问题讨论】:

  • 也许在您的代码的未来部分您将转换为Tensor?如果答案是肯定的,您可以使用tf.random_shuffle
  • 转移到Tensor的部分只是batch_part而不是所有数据...
  • 是否会在数据队列之前创建一个像 `tf.train.string_input_producer' 这样的随机文件名队列来解决您的问题?
  • Thks,但这会导致其他问题,请参阅stackoverflow.com/questions/44549245/…
  • 你介意洗牌是模型训练之前的预处理步骤吗?如果没有,请查看shuf unix 命令。

标签: tensorflow shuffle


【解决方案1】:

目前,Dataset API 不支持对整个数据集进行洗牌(超过 10k 个示例)。根据this线程,常见的做法是:

  1. 使用 MapReduce/Spark/Beam/等。创建一组大小大致相等的作业 文件(“碎片”)。
  2. 在每个时代:

    一个。使用 Dataset.list_files(...).shuffle(num_shards) 随机打乱分片文件名列表。

    b.使用 dataset.interleave(lambda filename: tf.data.TextLineDataset(filename), cycle_length=N) 将来自 N 个不同分片的记录混合在一起。

    c。使用 dataset.shuffle(B) 对生成的数据集进行混洗。设置 B 可能需要一些实验,但您可能希望将其设置为大于单个分片中记录数的值。

【讨论】:

    猜你喜欢
    • 2020-01-19
    • 2019-01-16
    • 1970-01-01
    • 2021-07-06
    • 1970-01-01
    • 2020-02-19
    • 1970-01-01
    • 1970-01-01
    • 2019-12-05
    相关资源
    最近更新 更多