众所周知,在数据驱动的深度学习时代,数据读取无论在训练/测试环节还是在推断环节,都是比较耗时的。
如果这个任务你只执行一次的情况,那还好。如果今天运行结束,存储变量消失,改天还要再训练,那就是一件麻烦事。
如果老板没看出来还行,如果老板发现你是用这段时间在摸鱼,那就麻烦了。有没有什么好办法呢?
一种方法就是多进程,例:
from multiprocessing import Pool
pool = Pool(25)
for file in file_list:
result.append(pool.apply_async(func, (file,)))
pool.close()
pool.join()
使用这种方法,一方面要求你的电脑性能高,另一方面其实读取速度也未必能尽如人意。
各种百度以及亲身体验,终于发现h5py是一款处理此问题的大杀器。
它的使用非常简单。
首先是安装:
pip install h5py1.将数据保存成.h5格式
先按常规方法将数据读入变量:x_train, y_train;x_val, y_val。
def save_h5(path, data_x, data_y, flag):
f = h5py.File(path, 'w')
f.create_dataset(f"x_{flag}", data=data_x)
f.create_dataset(f"y_{flag}", data=data_y)
f.close()
h5_train='train.h5'
h5_val='val.h5'
save_h5(h5_train, x_train, y_train, "train")
save_h5(h5_val, x_val, y_val, "val")
2.读取.h5格式数据
def read_h5(path, key_data, key_label):
x, y = None, None
f = h5py.File(path, 'r')
x = f[key_data][:]
y = f[key_label][:]
f.close()
return x, y
x_train, y_train = read_h5(h5_train, 'x_train', 'y_train')
x_val, y_val = read_h5(h5_val, 'x_val', 'y_val')
这样就OK了。
测试了下,按通常的方法大致需要3000s的数据集,使用这种.h5格式读取只需要不到十秒,确实是相当惊喜的发现。
参考文献[1] https://docs.h5py.org/en/stable/quick.html
[2] csdn:HDF5文件的介绍及python将大量图片文件存储为hdf5文件方便训练



