【问题标题】:tensorflow - tf.data.Dataset randomly skip samples before batching to get different batchestensorflow - tf.data.Dataset 在批处理前随机跳过样本以获得不同的批次
【发布时间】:2019-04-26 09:00:36
【问题描述】:

我的模型在每个输入批次中使用按时间顺序排列的序列。因此,我在改组输入数据之前创建批次。这带来了一个问题,即批次总是在整个数据集中包含相同的数据样本(从相同的索引开始 - 移动 batch_size),我通过缓存初始数据集并从跳过的数据集中采样解决了这个问题,但这会占用内存相当快(虽然我的数据集只有 150MB):

dataset = tf.data.Dataset.from_tensor_slices(data)
dataset = dataset.window(size=window_size, shift=window_shift, stride=window_stride, drop_remainder=True).flat_map(lambda x: x.batch(window_size))
dataset = dataset.map(process_fn, num_parallel_calls=8)
dataset = dataset.cache()
datasets = []
for i in range(0, batch_size):
    d = dataset.skip(i)
    d = d.batch(batch_size, drop_remainder=True)
    datasets.append(d)
dataset = tf.data.experimental.sample_from_datasets(datasets)
dataset = dataset.shuffle(buffer_size=30000, reshuffle_each_iteration=False)
dataset = dataset.repeat()

还有其他方法可以实现这种行为吗?我想涵盖批次内第一个序列开始的所有可能索引。

【问题讨论】:

  • 你找到更好的方法来减少内存使用了吗?
  • 遗憾的是,我还没有重构这部分代码。我不确定现在是否有更好的方法。
  • 我看到你的设置 buffere_size 为 3,000。你试过像3这样的小数字吗?还有什么dataset 尺寸和形状?
  • 您应该提供更多类似process_fnbatch_size 的代码,以便我们重现问题。
  • batch_size 是 128

标签: python tensorflow tensorflow-datasets tensorflow-estimator


【解决方案1】:

您正在消耗内存,因为您正在改组整个批次 - 而且跳过可能不是很有效。由于您的数据似乎在内存中是完整的,您可以直接在 python 中对数据进行采样,而无需过多关注性能:

def make_batch(start_idx):
  batch = np.empty((batch_size, window_size), dtype=data.dtype)
  for batch_idx, data_idx in enumerate(
      range(start_idx, start_idx + window_shift * batch_size, window_shift)):
    batch[batch_idx] = data[data_idx:data_idx + window_size * window_stride:window_stride]
  return batch

dataset = (tf.data.Dataset
  .range(len(data) - window_stride * (window_size - 1) - window_shift * (batch_size- 1))
  .shuffle(buffer_size=30000, reshuffle_each_iteration=False)
  .map(lambda x: tf.py_func(make_batch, [x], tf.float32)) # assuming your data is float32
  .repeat()
  .prefetch(1)) # you might want to consider prefetching for performance

洗牌现在发生在索引上,而不是整个批次上,因此它的内存占用要低得多。

【讨论】:

  • 感谢您的帮助,我会调查的。无论如何,我希望有一个纯粹的 tensorflow 解决方案来解决这个问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-31
  • 2016-04-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-21
相关资源
最近更新 更多