繁体   English   中英

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

[英]tf.data pipeline design for optimized performance

我是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之前调用batchshuffle播放缓冲区将包含5000 * self.batch_size记录,而不是5000

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

shufflebatch

>>> 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])]

batchshuffle

>>> 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])]

通常,改组是在批处理之前完成的,以避免批处理中的所有元素都是顺序的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM