自己构建的reader数据读取速度太慢
收藏
大家好,我最近刚开始使用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
收藏
请登录后评论
为什么代码没有高亮显示呢,我选了python啊。
问题的原因找到了,是shuffle这的问题,按照我这样写,每次都会重新读入并打乱整个数据集,每个batch都会重新读入并且打乱一遍,但实际上只打乱一次就行了,后面按顺序读取就好了,可以把buf_size调小一点,我目前设置成了2*batch_size。后面想想办法看能不能实现就在开头打乱一次,后面直接就用那个乱的,不再训练中打乱了。
参考:https://www.paddlepaddle.org.cn/documentation/docs/zh/beginners_guide/coding_practice/Reader.html#reader