看到一些深度学习的项目中,把图片数据集转换为numpy类型,然后保存为hdf5文件,然后再读取文件进行处理和导入神经网络。我有点想不通,保存为hdf5文件有什么用?
如果是为了读取速度快一点,那这些图片也就是一开始导入数据预处理的时候需要读取一次,后面就直接用处理后的numpy类型图片转成tensor类型进行训练。就读一次,就算读快一点也快不了多少吧。
而且假如说原来的数据集有500M,保存hdf5文件3G,这不是还占用更多的内存了吗?
还有一个问题,如果一开始把所有的图片都读进内存,创建自己的Dataset类和Dataloader,如果碰到一些大型的数据集就可能造成内存溢出,有没有什么解决方案?
我想到两种,一种是在dataset类的getitem (self,idx) 里面调用数据生成器,在类里面写一个调用一次就生成一个数据的生成器的函数,此时的idx是没有用的。每次调用的时候随机抽一张图片进行处理 ,作为一个数据。然后用dataloader包裹,batch_size如果设为32,就会调用32次数据生成器产生32个随机的数据。但是我不确定数据生成器里面怎么样随机抽一张图片,会不会训练了很多次,抽了很多次,结果数据集里面还有图片没有抽到,对效果产生一定影响?还有dataset类里面的len()函数即dataset的长度我应该怎么设置,一个epoch训练完一个len()大小的dataset,利用dataloader每次加载32个数据即一个batch,数据集长度应该是所需要训练的batch的数量×32,那我怎么确定batch的数量要多少?还是说直接设置长度为总共的图片数量即可?
我想到的第二种就是直接不加载所有的图片,而是先生成所有图片的地址保存为csv或者txt格式,然后进行打乱,dataset里面就按照idx读取路径,然后读取到图片进行处理,得到一个数据。然后也用dataloader包裹,两种方法内存中只需要加载当前的32张图片即可。但是按照这种方法的话,也不能使用hdf5保存,因为要用到图片的地址。
所以说在训练的时候,怎么样让占用的cpu内存尽可能小?
图片大小很大但是数量不是很多,图片数量很多但是每张图片不大,这两种情况应该怎么加载数据比较好?
最后,在深度学习图片处理中hdf5文件还有什么用?什么地方需要用到hdf5?
刚看到这篇文章:https://blog.csdn.net/mogoweb/article/details/87881405?
转成numpy类型,保存为hdf5文件花了30G!加载到内存里面岂不是直接爆了?我想不通
我觉得只是保存下而已吧,,,留个案底
原因
1、在处理大量数据时,无论是实验性的还是模拟的,将其保存到多个文本文件并不是很有效。
有时您需要访问数据集的特定子集,并且不想将其全部加载到内存中。
如果您正在寻找与 numpy 和 pandas 完美集成的解决方案
,那么 HDF5 格式可能是您正在寻找的解决方案。
2、每个 HDF5 文件都有一个内部结构,允许您搜索特定的数据集。
您可以将其视为具有层次结构的单个文件,就像文件夹和子文件夹的集合一样。
默认情况下,数据以二进制格式存储,库兼容不同的数据类型。HDF5 格式的一个重要选项是它允许将元数据附加到结构中的每个元素,使其成为生成不言自明文件的理想选择。
3、在 Python 中,有两个库可以与 HDF5 格式交互:PyTables和h5py。
第一个是 Pandas 在后台使用的,而第二个是将 HDF5 规范的特征映射到 numpy 数组的那个。
虽然 PyTables 可以被认为是在 HDF5 规范之上实现类似数据库的功能,但在处理 N 维 numpy 数组(不仅仅是表)时, h5py是自然的选择。两个库的某些功能相同,但我们将重点关注h5py。
4、HDF5 格式最令人兴奋的功能之一是仅在需要时才从硬盘驱动器中读取数据。
想象一下,您有一个不适合可用 RAM 的大型阵列。一个明显的例子是电影,它是一系列二维数组。也许您只想查看较小的区域而不是全画幅。您可以直接访问所需的数据,而不是将每一帧加载到内存中。H5py 允许您像处理阵列一样处理硬盘驱动器上的数据。
如果想看如何使用比如读取、写入、压缩数据等,上述链接都有介绍
如有问题及时沟通
存储为hdf5后,自己写个dataset方法,要求有getitem 和len就行,len即你的数据总长度。 然后通过该dataset获取data,并加载到dataloader,dataloader传入batch,shuffle(是否打乱每个batch中的顺序,train为true,valid和test则为false),numworks(windows下设为0,多线程读取),drop_last(是否舍去最后一个不够batch的返回),这样即可每次获取一个batch的数据,并且这些batch是根据shuffle确定是否打乱
另外,使用hdf5的话,你需要先将所有图片resize成相同大小(这是不可避免的操作,而且这样相当于省去了加载时还要resize的过程)。
HDF5 (Hierarchical Data Format) 由美国伊利诺伊大学厄巴纳-香槟分校 UIUC (University of Illinois at Urbana-Champaign) 开发,是一种常见的跨平台数据储存文件,可以存储不同类型的图像和数码数据,并且可以在不同类型的机器上传输,同时还有统一处理这种文件格式的函数库。
他就是把文件可以以一种比较统一的方式组织起来,方便你在内存中读取调用,我觉得你把它理解为就是一个方便处理媒体数据的包就OK了,你也可以不用它,用其他方式。
可以下次调用