【问题标题】:TensorFlow DataSet shuffle - data shuffling only starting from second epochTensorFlow DataSet shuffle - 仅从第二个 epoch 开始的数据混洗
【发布时间】:2018-04-18 04:19:22
【问题描述】:

我正在使用 tensorflow 数据集作为输入数据管道。我想知道如何在第一个时期不进行数据洗牌的情况下进行训练,并从第二个时期开始洗牌数据。

图表通常是在迭代训练开始之前构建的,并且在训练期间,如何更改 DataSet 改组行为似乎并不直接,因为在我看来这有点像更改图表。

有什么想法吗?

谢谢, 哈利

【问题讨论】:

    标签: tensorflow tensorflow-datasets


    【解决方案1】:

    Dataset.shuffle()buffer_size 参数可以是计算得出的 tf.Tensor,因此您可以使用以下代码使用 Dataset.range(NUM_EPOCHS).flat_map(...) 将纪元数序列转换为 @ 的(混洗或其他)元素987654326@:

    NUM_EPOCHS = ...  # The total number of epochs.
    BUFFER_SIZE = ...  # The shuffle buffer size to use from the second epoch on.
    
    per_epoch_dataset = ...  # A `Dataset` representing the elements of a single epoch.
    
    def shuffle_after_first_epoch(epoch):
      # Set `epoch_buffer_size` to 1 (i.e. no shuffling) in the 0th epoch,
      # and `BUFFER_SIZE` thereafter.
      epoch_buffer_size = tf.cond(tf.equal(epoch, 0),
                                  lambda: tf.constant(1, tf.int64),
                                  lambda: tf.constant(BUFFER_SIZE, tf.int64))
      return per_epoch_dataset.shuffle(epoch_buffer_size)
    
    dataset = tf.data.Dataset.range(NUM_EPOCHS).flat_map(shuffle_after_first_epoch)
    

    【讨论】:

    • 谢谢你,先生!我不确定我是否完全理解 flat_map 所取得的成就。我想在这种情况下我不再需要 dataset.repeat(num_epoch) 了吗?
    • 没错。 flat_map() 就像一个嵌套的 for 循环,它围绕在 per_epoch_dataset 上的一个循环,它产生每个元素。
    • 太棒了!非常感谢mrry的帮助!谢谢!
    • 嗨,先生,这个方向的一个额外问题,我想把 dataset.batch() 放在 flat_map() 之前,通过这样做,我支持的行为应该是第一个不打乱批次纪元,但从第二纪元开始,对吗?
    • .batch() 直接放在flat_map() 之前(即执行Dataset.range(...).batch(...).flat_map(...))会批量处理纪元ID,我怀疑这不是您想要做的。放置.batch() 的最合适位置是return per_epoch_dataset.shuffle(epoch_buffer_size).batch(...),然后您将在第一个时期获得非混洗批次,并在所有后续时期获得混洗批次。
    猜你喜欢
    • 2017-10-22
    • 2021-03-19
    • 2021-06-28
    • 2021-06-08
    • 2023-04-06
    • 2021-01-29
    • 1970-01-01
    • 2020-06-29
    • 1970-01-01
    相关资源
    最近更新 更多