首页 Paddle框架 帖子详情
自己构建的reader数据读取速度太慢
收藏
快速回复
Paddle框架 问答深度学习 1200 2
自己构建的reader数据读取速度太慢
收藏
快速回复
Paddle框架 问答深度学习 1200 2

大家好,我最近刚开始使用paddlepaddle,想在这里复现之前看的一篇论文(已经用torch复现成功了),其它都挺好,就是在数据集构建这部分,我之前没有用过reader这种方法构建数据集,就仿照论坛的一些例子构建了一个读取的reader,相关代码如下:

#为了方便数据处理,我把reader定义在了一个类中
class Cornell:
    def __init__(self,file_dir,include_depth=True,include_rgb=True,start = 0.0,end = 1.0,output_size = 300,n = 10):
        #一些参数的传递
        self.include_depth = include_depth
        self.include_rgb = include_rgb
        self.output_size = output_size
        #去指定路径载入数据集数据
        graspf = glob.glob(os.path.join(file_dir,'*','pcd*cpos.txt'))

        graspf.sort()

        l = len(graspf)
        if l == 0:
            raise FileNotFoundError('没有查找到数据集,请检查路径{}'.format(file_dir))
        
        self.graspf = graspf[int(l*start):int(l*end)]
    
    '''
    中间是一些不相关的数据处理过程
    '''  
    def reader(self):
        for id_x in range(len(self.graspf)):
            x,pos_img,cos_img,sin_img,width_img,idx = self.pre_process(id_x)
            yield x,(pos_img,cos_img,sin_img,width_img),idx
    
    def __getitem__(self):
        return self.reader

#准备数据集
cornell_path = '/home/aistudio/data/data53438/cornell'
cornell_data = Cornell(cornell_path)

shuffle_reader = paddle.reader.shuffle(cornell_data.__getitem__(), buf_size=len(cornell_data.graspf))

dataset = paddle.batch(shuffle_reader,
                            batch_size=batch_size,
                            drop_last=True)


然后在这个reader中读取batch循环开始训练的时候,如下图我发现遍历这个reader只需要一秒钟的时间,但整段代码运行却花了20多秒(真正训练的时候也是这样,训练十几个batch就一秒左右,但从开始到进入循环却要用20多秒),这不合理啊,是我哪里搞错了吗,恳请各位大佬指教。最后说明一下,整个程序是可以正常运行训练的,训练也很快,就是在这块,一执行dataset()这句就要花20多秒,但每个epoch都是要执行的,这速度就被拖下来了。

0
收藏
回复
全部评论(2)
时间顺序
刘奕奕伊伊
#2 回复于2020-09

为什么代码没有高亮显示呢,我选了python啊。

#为了方便数据处理,我把reader定义在了一个类中
class Cornell:
    def __init__(self,file_dir,include_depth=True,include_rgb=True,start = 0.0,end = 1.0,output_size = 300,n = 10):
        #一些参数的传递
        self.include_depth = include_depth
        self.include_rgb = include_rgb
        self.output_size = output_size
        #去指定路径载入数据集数据
        graspf = glob.glob(os.path.join(file_dir,'*','pcd*cpos.txt'))

        graspf.sort()

        l = len(graspf)
        if l == 0:
            raise FileNotFoundError('没有查找到数据集,请检查路径{}'.format(file_dir))
        
        self.graspf = graspf[int(l*start):int(l*end)]
    
    '''
    中间是一些不相关的数据处理过程
    '''  
    def reader(self):
        for id_x in range(len(self.graspf)):
            x,pos_img,cos_img,sin_img,width_img,idx = self.pre_process(id_x)
            yield x,(pos_img,cos_img,sin_img,width_img),idx
    
    def __getitem__(self):
        return self.reader

#准备数据集
cornell_path = '/home/aistudio/data/data53438/cornell'
cornell_data = Cornell(cornell_path)

shuffle_reader = paddle.reader.shuffle(cornell_data.__getitem__(), buf_size=len(cornell_data.graspf))

dataset = paddle.batch(shuffle_reader,
                            batch_size=batch_size,
                            drop_last=True)
0
回复
刘奕奕伊伊
#3 回复于2020-09

问题的原因找到了,是shuffle这的问题,按照我这样写,每次都会重新读入并打乱整个数据集,每个batch都会重新读入并且打乱一遍,但实际上只打乱一次就行了,后面按顺序读取就好了,可以把buf_size调小一点,我目前设置成了2*batch_size。后面想想办法看能不能实现就在开头打乱一次,后面直接就用那个乱的,不再训练中打乱了。

 

参考:https://www.paddlepaddle.org.cn/documentation/docs/zh/beginners_guide/coding_practice/Reader.html#reader

0
回复
需求/bug反馈?一键提issue告诉我们
发现bug?如果您知道修复办法,欢迎提pr直接参与建设飞桨~
在@后输入用户全名并按空格结束,可艾特全站任一用户