优化性能的tf.data管道设计



我是TensorFlow的新手,我想知道是否有使用tfdata设置数据集的特定顺序。例如:

data_files = tf.gfile.Glob("%s%s%s" % ("./data/cifar-100-binary/", self.data_key, ".bin"))
data = tf.data.FixedLengthRecordDataset(data_files, record_bytes=3074)
data = data.map(self.load_transform)
if self.shuffle_key:
data = data.shuffle(5000)
data = data.batch(self.batch_size).repeat(100)
iterator = data.make_one_shot_iterator()
img, label = iterator.get_next()
# label = tf.one_hot(label, depth=100)
print('img_shape:', img.shape)

在这种情况下,我读取数据,然后打乱数据,然后进行批量和重复规范。使用这种方法,我的计算机的RAM增加了2%的

然后我又尝试了一种方法:

data_files = tf.gfile.Glob("%s%s%s" % ("./data/cifar-100-binary/", self.data_key, ".bin"))
data = tf.data.FixedLengthRecordDataset(data_files, record_bytes=3074)
data = data.map(self.load_transform)
data = data.batch(self.batch_size).repeat(100)
if self.shuffle_key:
data = data.shuffle(5000)
iterator = data.make_one_shot_iterator()
img, label = iterator.get_next()
# label = tf.one_hot(label, depth=100)
print('img_shape:', img.shape)

所以在这种情况下,当我第一次指定批量大小,重复,然后洗牌时,RAM利用率增加了40%(我不知道为什么(,如果有人帮我弄清楚这一点,那就太好了。那么,在使用tf.data定义tensorflow中的数据集时,是否应该始终遵循一个序列?

内存使用率会增加,因为您正在打乱批次而不是单个记录。

data.shuffle(5000)将填充5000元素的缓冲区,然后从缓冲区中随机采样以产生下一个元素。

data.batch(self.batch_size)将元素类型从单个记录更改为批量记录。因此,如果在shuffle之前调用batch,则混洗缓冲区将包含5000 * self.batch_size记录,而不仅仅是5000

调用shufflebatch的顺序也会影响数据本身。在混洗之前进行批处理将导致批处理的所有元素都是顺序的。

shuffle之前的batch

>>> dataset = tf.data.Dataset.range(12)
>>> dataset = dataset.batch(3)
>>> dataset = dataset.shuffle(4)
>>> print([element.numpy() for element in dataset])
[array([ 9, 10, 11]), array([0, 1, 2]), array([3, 4, 5]), array([6, 7, 8])]

batch之前的shuffle

>>> dataset = tf.data.Dataset.range(12)
>>> dataset = dataset.shuffle(4)
>>> dataset = dataset.batch(3)
>>> print([element.numpy() for element in dataset])
[array([1, 2, 5]), array([4, 7, 8]), array([0, 3, 9]), array([ 6, 10, 11])]

通常在批处理之前进行混洗,以避免批处理中的所有元素都是顺序的。

相关内容

  • 没有找到相关文章

最新更新