也许以前有人问过这个问题,但我找不到适合我情况的相关信息。
我正在使用 PyTorch 创建一个 CNN,用于对图像数据进行回归。我没有正式的学术编程背景,所以我的许多方法都是临时的,而且效率非常低。很多时候我可以回顾我的代码并稍后清理,因为效率低下并没有严重到性能受到显着影响。然而,在这种情况下,我使用图像数据的方法需要很长时间,使用大量内存,并且每次我想测试模型的变化时都要这样做。
我所做的基本上是将图像数据加载到 numpy 数组中,将这些数组保存在 .npy 文件中,然后当我想将所述数据用于模型时,我将所有数据导入该文件中。我不认为数据集真的那么大,因为它由 5000 个 3 色 channel 图像组成,大小为 64x64。然而,我的内存使用率在加载时飙升至 70%-80%(超过 16 GB),并且每次加载都需要 20-30 秒。
我的猜测是我对加载它的方式很愚蠢,但坦率地说,我不确定标准是什么。我应该以某种方式在需要之前将图像数据放在某个地方,还是应该直接从图像文件加载数据?在任何一种情况下,独立于文件结构的最好、最有效的方法是什么?
我将非常感谢对此的任何帮助。
请您参考如下方法:
为了提高速度,我建议使用 HDF5 或 LMDB:
Reasons to use LMDB:
LMDB uses memory-mapped files, giving much better I/O performance. Works well with really large datasets. The HDF5 files are always read entirely into memory, so you can’t have any HDF5 file exceed your memory capacity. You can easily split your data into several HDF5 files though (just put several paths to h5 files in your text file). Then again, compared to LMDB’s page caching the I/O performance won’t be nearly as good. [http://deepdish.io/2015/04/28/creating-lmdb-in-python/]
如果您决定使用 LMDB:
ml-pyxis是使用 LMDB 创建和读取深度学习数据集的工具。*(我是该工具的共同作者)
它允许创建二进制 blob (LMDB),并且可以非常快速地读取它们。上面的链接附带了一些关于如何创建和读取数据的简单示例。包括 python 生成器/迭代器。
这notebook有一个关于如何创建数据集并在使用 pytorch 时并行读取它的示例。
如果您决定使用 HDF5:
PyTables 是一个用于管理分层数据集的包,旨在高效、轻松地处理极大量的数据。
