lezilisy 2022-05-21 21:10 采纳率: 42.9%
浏览 220
已结题

深度学习中有的项目将图片数据集保存为hdf5文件有什么用?什么时候需要用到hdf5?

看到一些深度学习的项目中,把图片数据集转换为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?

  • 写回答

6条回答 默认 最新

  • lezilisy 2022-05-21 21:51
    关注

    刚看到这篇文章:https://blog.csdn.net/mogoweb/article/details/87881405?
    转成numpy类型,保存为hdf5文件花了30G!加载到内存里面岂不是直接爆了?我想不通

    评论

报告相同问题?

问题事件

  • 系统已结题 5月29日
  • 创建了问题 5月21日

悬赏问题

  • ¥15 ubuntu子系统密码忘记
  • ¥15 信号傅里叶变换在matlab上遇到的小问题请求帮助
  • ¥15 保护模式-系统加载-段寄存器
  • ¥15 电脑桌面设定一个区域禁止鼠标操作
  • ¥15 求NPF226060磁芯的详细资料
  • ¥15 使用R语言marginaleffects包进行边际效应图绘制
  • ¥20 usb设备兼容性问题
  • ¥15 错误(10048): “调用exui内部功能”库命令的参数“参数4”不能接受空数据。怎么解决啊
  • ¥15 安装svn网络有问题怎么办
  • ¥15 vue2登录调用后端接口如何实现