我遇到以下问题,我打开了很多3D卷文件以提取一堆numpy数组。 我想随机获取这些数组,即在所有情况下,如果所有数组都在单独的文件中,则打开的3D卷数与要获取的numpy数组一样多。 这里的IO不好,我打开一个大文件只是为了从中得到一个小的numpy数组。 知道如何存储所有这些数组以使IO更好吗? 我无法预读所有数组并将它们全部保存在一个文件中,因为那样的话,该文件太大了,无法打开RAM。
我查了一下LMDB,但这似乎全都和Caffe有关。 知道我该如何实现吗?
答案 0 :(得分:1)
我遍历数据集,创建了hdf5文件并将元素存储在hdf5中。事实证明,打开hdf5时,它不会加载ram中的所有数据,而是加载标头。 然后,该标头用于根据请求获取数据,这就是我解决问题的方式。
参考: http://www.machinelearninguru.com/deep_learning/data_preparation/hdf5/hdf5.html
答案 1 :(得分:0)
一个简单的解决方案可以预处理您的数据集,并分别保存原始3D体积的多个较小的作物。这样,您就牺牲了一些磁盘空间以提高IO效率。
请注意,您可以在此处与作物大小进行权衡:保存比所需输入更大的作物,仍可以即时进行随机作物增产。如果在预处理步骤中保存重叠的作物,则可以确保仍可以生成原始数据集的所有可能的随机作物。
或者,您可以尝试使用自定义数据加载器,该加载器会保留几批的全部卷。请注意,这可能会在批次之间产生某种关联。由于许多机器学习算法都依赖于i.i.d样本(例如随机梯度下降),因此相关的批次很容易造成严重的混乱。