【问题标题】:Tensorflow - shuffling at "batch-level" instead of"example-level"Tensorflow - 在“批处理级别”而不是“示例级别”进行改组
【发布时间】:2018-07-21 12:26:09
【问题描述】:

我有一个问题,我将尝试用一个例子来解释,以便于理解。

我想对橙子 (O) 和苹果 (A) 进行分类。出于技术/遗留原因(网络中的一个组件),每个批次应该只有 O 或只有 A 示例。因此,示例级别的传统改组是不可能/足够的,因为我负担不起包含 O 和 A 示例混合的批次。然而,某种洗牌是可取的,因为训练深度网络是一种常见的做法。

这些是我采取的步骤:

  • 我首先需要将原始数据/示例转换为 TFRecords。
  • 我将原始示例的顺序打乱,然后创建单独的 TFRecord,其中仅包含打乱的 O 示例或仅包含打乱的 A 示例。我们称之为“example-level”洗牌。这是离线发生的事情,而且只发生一次。
  • 此时我有“干净的批次”:仅包含 O 示例的 O 批次和仅包含 A 示例的 A 批次。
  • 我不想先向网络提供所有 O 批次,然后依次向网络提供所有 A 批次。这可能对收敛没有多大帮助。
  • 我可以在“批次级”上对这些批次进行洗牌,即不影响其内部吗?

【问题讨论】:

    标签: tensorflow batch-processing shuffle


    【解决方案1】:

    如果您使用Dataset api,它相当简单。只需压缩OA 批次,然后使用Dataset.map() 应用随机选择功能:

    ds0 = tf.data.Dataset.from_tensor_slices([0])
    ds0 = ds0.repeat()
    ds0 = ds0.batch(5)
    ds1 = tf.data.Dataset.from_tensor_slices([1])
    ds1 = ds1.repeat()
    ds1 = ds1.batch(5)
    
    def rand_select(ds0, ds1):
        rval = tf.random_uniform([])
        return tf.cond(rval<0.5, lambda: ds0, lambda: ds1)
    
    dataset = tf.data.Dataset()
    dataset = dataset.zip((ds0, ds1)).map(lambda ds0, ds1: rand_select(ds0, ds1))
    iterator = dataset.make_one_shot_iterator()
    ds = iterator.get_next()
    
    with tf.Session() as sess:
        for _ in range(5):
            print(sess.run(ds))
    
    > [0 0 0 0 0]
      [1 1 1 1 1]
      [1 1 1 1 1]
      [0 0 0 0 0]
      [0 0 0 0 0]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-05-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-02
      • 2018-08-24
      • 1970-01-01
      • 2018-10-20
      相关资源
      最近更新 更多