自己构建的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