MemoryError: Unable to allocate 115. GiB for an array with shape (1122, 1122, 12288) and data type f

Posted

技术标签:

【中文标题】MemoryError: Unable to allocate 115. GiB for an array with shape (1122, 1122, 12288) and data type float64【英文标题】: 【发布时间】:2020-05-22 20:31:35 【问题描述】:

我正在尝试传递一个函数,该函数返回一个扁平的图像和标签数组,我的操作系统是 Windows 10。此外,当我尝试调用该函数时,出现标题中描述的错误


我想要做的是:我想在函数内部从带有关键点的数据集中提取特征,并将 train_test_split 用于我的数据集,但即使我尝试用关键点展平图像,它也会让我错误,展平的​​唯一方法是没有关键点的相同图像。

这是我的尝试:

def load_image_files(fullpath, dimension=(35, 35)):
    flat_data = []
    orb = cv2.ORB_create(edgeThreshold=1, nfeatures=22)
    key_points = [cv2.KeyPoint(64, 9, 10), 
    cv2.KeyPoint(107, 6, 10), 
    cv2.KeyPoint(171, 10, 10)]
    kp, des = orb.compute(imageList, key_points)
    kparray = cv2.drawKeypoints(imageList, kp, None, flags=cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS); 
    img_resized = resize(kparray, dimension, anti_aliasing=True, mode='reflect')
    img_resized = img_resized.flatten()
    flat_data.append(img_resized)
    images.append(flat_data)

        flat_data = np.array(flat_data)
        images = np.array(images)
        return Bunch(data=flat_data,
                     images=images)

【问题讨论】:

通常您为此编写批处理生成器,因此一次只有一小部分数据集加载到内存中。你用什么来训练模型? 我使用 train_test_split 和 OneVsRest 进行多类分类。我怎么能写小批量呢? 不过,我没有使用神经网络。 这适用于任何使用 SGD 的算法,包括逻辑回归。我这个问题的意思是你正在使用什么框架(sklearn、tf、statmodels)? 对不起,我正在使用 sklearn 【参考方案1】:

在您的函数中。您将所有展平图像附加到导致此内存错误的单个列表中。相反,您可以使用 dask 数组来存储它们。dask 数组使用硬盘来存储数据非常适合内存。Dask 是一个类似于 sparks 的 python 库,专为大数据而设计。

【讨论】:

尝试使用像这样的 Dask 数组: flat_data = da.from_array(flat_data, chunks=(200, 361 )) target = da.from_array(target, chunks=(200, 361)) images = da .from_array(images, chunks=(200, 361)) 并得到这个错误:ValueError: Chunks do not add up to shape。得到块=((200, 361),), shape=(1122,) 这是因为破碎的块应该是相同大小的。最简单的解决方案是制作样本数量,这样它们就可以分解成 200 个块。如果你有10402 然后丢弃 2 个样本,这样剩下的样本就不能精确地分成 200 个的一部分 另外另一种解决方案可能是将您的数据存储为一些块的 numpy 数组。在您的示例中说如果您正在生成 10000 个样本。然后而不是将其附加到列表中。您可以附加 500 个样本,这可以适合您的记忆。然后您可以将该数组转储为 pickle 转储或使用 np.save fun 然后清除附加列表。再次附加接下来的 500 个样本并保存为 numpy 数组。在训练时,您可以编写一个生成器来加载这些数组一个一个地训练你的模型。

以上是关于MemoryError: Unable to allocate 115. GiB for an array with shape (1122, 1122, 12288) and data type f的主要内容,如果未能解决你的问题,请参考以下文章

Nacos 启动报错 Unable to start web server……Unable to start embedded Tomcat

idea 不能创建类啥原因 unable to parse template class

unable to inject dll into target怎么解决?

出现unable to open the service tomcat怎么办

unable to access jarfile baksmali.jar 怎么办

tomcat报错-----》Unable to open debugger port IDEA Unable to open debugger port