在做speech、nlp任务时,经常有这样一个需求:假设有一个数据集,有1000条数据,但是只有100种长度,所以必然存在某些数据是一样长的。我们想要让总体按照长短排序,但是同样长的数据要随机排序。经过了这个操作,再分batch,这样的效果就是同一个batch的数据长度差不多,对各种norm操作很友好,也节约显存;在每个epoch前进行这个操作可以实现不同epoch内数据的随机。
发现了一段精美的代码,如下:
def ordered_indices(self):
"""Return an ordered list of indices. Batches will be constructed based
on this order."""
if self.shuffle:
order = [np.random.permutation(len(self))]
order.append(
np.minimum(
np.array(self.sizes),
self.max_sample_size,
)
)
return np.lexsort(order)[::-1]
else:
return np.arange(len(self))