构建特性(将图像转换为派生特性[numpy数组])时内存不足?

2024-03-29 07:34:23 发布

您现在位置:Python中文网/ 问答频道 /正文

我把一些图像数据复制到Google云上的一个实例(8vcpu,64GB内存,teslak80gpu),在将原始数据转换为特性以及更改输出的数据结构时遇到内存问题。最后我想使用Keras/Tensorflow神经网络中的派生特性。在

流程

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

因为有大量的图像(x500i)和大量的图像(x500i)被加工成大量的图像。x的每个元素都是一个numpy数组,它以250x500x3的形状存储图像。在

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

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

enter image description hereenter image description here

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

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

x = np.array(x)

失败消息是:

^{pr2}$

如何调整此步骤以避免内存不足?


Tags: 数据实例内存图像numpy数据结构列表原始数据
1条回答
网友
1楼 · 发布于 2024-03-29 07:34:23

您的代码对每个映像都有两个副本—一个在列表中,一个在数组中:

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

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

^{pr2}$

这意味着你一次只持有一个图像的副本。在


如果您事先不知道图像的大小或数据类型,或者不想硬编码,可以使用:

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来购买更多的存储空间,但要牺牲精度

相关问题 更多 >