data.append(np.array(img) / 255.0) numpy.core._exceptions._ArrayMemoryError: Unable to allocate 30.5 MiB for an array with shape (1000, 1000, 4) and data type float64显示了这个错误
时间: 2024-02-20 10:58:37 浏览: 148
这个错误提示意味着你的程序尝试分配 30.5 MiB 的内存来存储这个数组,但是你的系统没有这么多可用的内存。因此,你需要对数组进行降维或者使用其他方法来减少内存占用。
一种可行的方法是减小图片的大小,这样可以减少数组的大小并降低内存占用。另一种方法是使用数据生成器来逐个读入图片并进行处理,这样可以避免一次性读入所有图片导致内存溢出。
以下是修改后的代码,使用数据生成器来读入图片并进行处理:
```python
import os
import numpy as np
from PIL import Image
from keras.layers import Input, Conv2D, MaxPooling2D, UpSampling2D
from keras.models import Model
from sklearn.cluster import KMeans
# 定义卷积自编码器模型
input_img = Input(shape=(1000, 1000, 3))
x = Conv2D(32, (3, 3), activation='relu', padding='same')(input_img)
x = MaxPooling2D((2, 2), padding='same')(x)
x = Conv2D(16, (3, 3), activation='relu', padding='same')(x)
x = MaxPooling2D((2, 2), padding='same')(x)
x = Conv2D(8, (3, 3), activation='relu', padding='same')(x)
encoded = MaxPooling2D((2, 2), padding='same')(x)
x = Conv2D(8, (3, 3), activation='relu', padding='same')(encoded)
x = UpSampling2D((2, 2))(x)
x = Conv2D(16, (3, 3), activation='relu', padding='same')(x)
x = UpSampling2D((2, 2))(x)
x = Conv2D(32, (3, 3), activation='relu')(x)
x = UpSampling2D((2, 2))(x)
decoded = Conv2D(3, (3, 3), activation='sigmoid', padding='same')(x)
autoencoder = Model(input_img, decoded)
autoencoder.compile(optimizer='adam', loss='binary_crossentropy')
# 定义数据生成器
def data_generator():
for folder in os.listdir("D:/wjd"):
for file in os.listdir("D:/wjd/"+folder):
img = Image.open("D:/wjd/"+folder+"/"+file)
img = img.resize((500, 500)) # 降低图片大小
yield np.array(img) / 255.0
# 训练卷积自编码器
autoencoder.fit(data_generator(), steps_per_epoch=2400, epochs=50, batch_size=32)
# 提取特征
def feature_generator():
for folder in os.listdir("D:/wjd"):
for file in os.listdir("D:/wjd/"+folder):
img = Image.open("D:/wjd/"+folder+"/"+file)
img = img.resize((500, 500)) # 降低图片大小
yield np.array(img) / 255.0
encoder = Model(input_img, encoded)
features = encoder.predict(feature_generator(), steps=2400)
# 使用KMeans聚类算法将特征分为两类
kmeans = KMeans(n_clusters=2, random_state=0).fit(features)
# 将分类结果保存到对应的文件夹中
for i, label in enumerate(kmeans.labels_):
filename = str(i+1) + ".png"
if label == 0:
os.rename("D:/wjd/"+str(i+1)+".png", "D:/wjd/FCC/"+filename)
else:
os.rename("D:/wjd/"+str(i+1)+".png", "D:/wjd/BCC/"+filename)
```
这个修改后的代码使用数据生成器来逐个读入图片并进行处理,这样可以避免一次性读入所有图片导致内存溢出。同时,降低图片大小也可以减少数组的大小并降低内存占用。
阅读全文