【问题标题】:Running out of memory when building features (converting images into derived features [numpy arrays])?构建特征时内存不足(将图像转换为派生特征 [numpy 数组])?
【发布时间】:2018-02-23 00:23:49
【问题描述】:

我将一些图像数据复制到 Google Cloud 上的一个实例(8 个 vCPU,64GB 内存,Tesla K80 GPU),在将原始数据转换为特征并更改输出的数据结构时遇到了内存问题。最终我想使用 Keras/Tensorflow 神经网络中的派生特征。

流程

将数据复制到存储桶后,我运行 build_features.py 函数将原始数据转换为神经网络的处理数据。在这个管道中,我首先获取每个原始图像并将其放入列表 x 中(其中存储派生特征)。

由于我正在处理大量图像(数以万计的图像类型为 float32,尺寸为 250x500x3),因此列表 x 变得非常大。 x 的每个元素都是 numpy 数组,以 250x500x3 的形状存储图像。

问题 1 - 随着列表 x 的增长而减少内存

我拍摄了 2 张屏幕截图,显示可用内存随着 x 的增长而减少(下图)。我最终能够完成这一步,但我只剩下几 GB 的内存,所以我肯定想解决这个问题(将来我想使用更大的数据集)。 如何在不受 x 大小限制的情况下构建功能?

问题 2 - 将 x 转换为 numpy 数组时出现内存错误

实例实际失败的步骤如下:

x = np.array(x)

失败信息是:

Traceback (most recent call last):
  File "build_features.py", line 149, in <module>
    build_features(pipeline='9_11_2017_fan_3_lights')
  File "build_features.py", line 122, in build_features
    x = np.array(x)
MemoryError

如何调整这一步以免内存不足?

【问题讨论】:

    标签: python numpy machine-learning tensorflow feature-extraction


    【解决方案1】:

    您的代码有每个图像的两个副本 - 一个在列表中,一个在数组中:

    images = []
    for i in range(many):
        images[i] = load_img(i) # here's the first image
    
    x = np.array(images) # joint them all together into a second copy
    

    只需将图像直接加载到数组中

    x = np.zeros((many, 250, 500, 3)
    for i in range(many):
        x[i] = load_img(i)
    

    这意味着您一次只能持有一张图片的副本。


    如果您不提前知道图像的大小或 dtype,或者不想对其进行硬编码,则可以使用:

    x0 = load_img(0)
    x = np.zeros((many,) + x0.shape, x0.dtype)
    for i in range(1, many):
        x[i] = load_img(i)
    

    话虽如此,但您现在走在一条棘手的道路上。如果您没有足够的空间在内存中存储两次数据集,那么您也没有空间来计算 y = x + 1

    您可能需要考虑使用np.float16 购买更多存储空间,但会牺牲精度

    【讨论】:

    • 但在我的情况下,第一个列表 x 和 numpy 数组 x 具有相同的名称。那么我是否没有覆盖第一个数组,从而不存储 2 个副本?
    • @megashigger:列表只能在数组创建后才能销毁,所以两者存在时会有重叠期。你是对的,如果你设法执行那条线,内存使用量将再次下降到大致原来的水平
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-16
    • 2018-08-19
    • 2022-01-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多