我想重塑图像列表,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)
的MemoryError
答案 0 :(得分:2)
看起来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')
如果有效,请尝试制作两个。