高效地为具有内存限制的神经网络训练创建 HDF5 图像数据集

Posted

技术标签:

【中文标题】高效地为具有内存限制的神经网络训练创建 HDF5 图像数据集【英文标题】:Efficiently Create HDF5 Image Dataset for Neural Network Training with Memory Limitations 【发布时间】:2019-07-29 15:02:49 【问题描述】:

我有大型图像数据集来训练 CNN。由于我无法将所有图像加载到我的 RAM 中,因此我计划将它们转储到 HDF5 文件(使用 h5py)中,然后按照

中的建议逐批迭代设置

Most efficient way to use a large data set for PyTorch?

我尝试为位于同一组中的每张图片创建自己的数据集,这非常快。但我无法确定迭代组中的所有数据集,除了按名称访问集合。 作为一种替代方法,我尝试通过扩展其形状将所有图像迭代地放入一个数据集中,根据

How to append data to one specific dataset in a hdf5 file with h5py 和

incremental writes to hdf5 with h5py

但这很慢。是否有更快的方法来创建 HDF5 数据集以进行迭代?

【问题讨论】:

您可以通过使用 group.keys() 并检查 h5py.Dataset 的实例来遍历组中的所有数据集。例如:***.com/questions/34330283/… 这个问题是我想批量访问数据,例如一次 32 张图像。在每个时期再次从单组数据集中创建这个批次非常慢...... 您不应该将每个图像都作为自己的数据集,而应该将其作为第一个轴代表图像的大型数据集。所以 10 张 256x256 RGB 图像的堆栈应该是一个形状为 [10, 256, 256, 3] 的数据集 谢谢!我意识到通过不压缩数据并且不每次迭代都重塑数据集,可以大大加快数据集的创建速度。 最重要的是chunk_shape和chunk_cache。该文档在此主题上不是很好。例如。 ***.com/a/48405220/4045774 相当常见的错误也是在每次迭代时打开/关闭 hdf5 文件。如果操作正确,您应该可以轻松达到 HDD 或 SATA-SSD 的顺序 IO 速度。但是如果没有代码示例,就很难说为什么你的实现这么慢。 【参考方案1】:

我意识到这是一个老问题,但我发现了一个非常有用的资源,我想分享一下这个主题:

https://www.oreilly.com/library/view/python-and-hdf5/9781491944981/ch04.html

基本上,hdf5(启用块)就像一个小文件系统。它将数据存储在分散在内存中的块中。因此,就像文件系统一样,它受益于局部性。如果块与您尝试访问的数组部分的形状相同,则读/写会很快。如果您要查找的数据分散在多个块中,则访问速度会很慢。

因此,在图像上训练神经网络的情况下,您可能必须将图像设置为标准尺寸。创建数据集的时候设置chunks=(1,) + image_shape,甚至更好,chunks=(batch_size,) + image_shape,读/写会快很多。

【讨论】:

以上是关于高效地为具有内存限制的神经网络训练创建 HDF5 图像数据集的主要内容,如果未能解决你的问题,请参考以下文章

用于不适合内存的大型 hdf5 文件的 Keras 自定义数据生成器

word2vec高效训练方法

HDF5 数据集数量限制

用于创建 HDF5 数据集的 4 维 c++ 数组的动态内存分配

DEiT:通过注意力训练数据高效的图像transformer &蒸馏

第58篇DEiT:通过注意力训练数据高效的图像transformer &蒸馏