【问题标题】:Numpy Reshape Memory errorNumpy重塑内存错误
【发布时间】:2018-02-24 12:08:36
【问题描述】:

我想重塑图像列表,train_data 大小为 639976。
这就是我导入图像的方式,

  train_data=[]
    for img in tqdm(os.listdir('Images/train/images')):
            path=os.path.join ('Images/train/images/',img)
            image=cv2.imread(path,cv2.IMREAD_COLOR)
            image=cv2.resize(image, (28,28)).astype('float32')/255
            train_data.append(image)
    return train_data



  np.reshape(train_data,(-1,28,28,3))

我在这里遇到内存错误。

 np.reshape(train_data,(-1,28,28,3))

错误:

返回数组(a, dtype, copy=False, order=order)
内存错误

【问题讨论】:

  • 你的数据大小不是28*28*3的整数倍。这就是导致.reshape() 失败的原因。
  • 这是一个数组列表,其中每个图像被导入为 (28*28) 作为 float32 类型。
  • 要精确。数组列表不是 multidim-array / np.array。此外,大多数常见图像不会自动转换为浮动(通常:uint8)。您显示的代码缺少所有这些细节。
  • 哦,所以您将np.reshape 应用于可能不同大小的图像的列表。 NumPy 尝试将它们转换为 4 维数组,但由于大小不同而失败。您应该确保train_data 的所有元素具有相同的大小或独立地重塑每个元素。
  • 我已经编辑了我的帖子。我在导入图像(28 * 28)时没有问题。我想我在导入时已经重塑了它们。但是为什么我稍后会出错?

标签: python numpy


【解决方案1】:

看起来train_data 是一个小数组的大列表。我不熟悉cv2,所以我猜是

image=cv2.resize(image, (28,28)).astype('float32')/255

创建 (28,28) 或 (28,28,3) 浮点数组。就其本身而言,不是很大。显然这行得通。

错误在:

np.reshape(train_data,(-1,28,28,3))

由于train_data 是列表,reshape 必须首先创建一个数组,可能是np.array(train_data)。如果所有组件都是 (28,28,3),则此数组已经是 (n,28,28,3) 形状。但这就是发生内存错误的地方。显然有一些这样的小(ish)数组,它没有内存来将它们组装成一个大数组。

我会尝试使用文件的子集。

In [1]: 639976*28*28*3
Out[1]: 1505223552  # floats
In [2]: _*8
Out[2]: 12041788416   # bytes

那是什么,12gb 阵列?我并不奇怪你会出现内存错误。数组列表占用的空间超过了这个空间,但它们可以通过内存和交换分散在小块中。从列表中创建一个数组,您的内存使用量会增加一倍。

只是为了好玩,尝试制作一个该大小的空白数组:

np.ones((639976,28,28,3), 'float32')

如果可行,请尝试制作两个。

【讨论】:

  • 太棒了,我明白了这个问题。这是因为我将灰度和彩色图像的混合导入为彩色图像。现在 comm.Scatter 和 comm.Gatherv 可以在这里工作或任何其他代码示例?
  • 如果列表混合了 2 维和 3 维数组,那么 np.array 将创建一个对象 dtype 数组,而不会消耗太多内存。但是重塑不起作用,并显示有关错误数量的元素的错误消息。
猜你喜欢
  • 2018-02-06
  • 1970-01-01
  • 1970-01-01
  • 2011-05-18
  • 1970-01-01
  • 1970-01-01
  • 2019-08-30
  • 2019-09-16
  • 1970-01-01
相关资源
最近更新 更多