归一化FER数据集时触发MemoryError,如何解决该问题?
解决FER数据集归一化时的MemoryError问题
针对处理FER数据集时出现的MemoryError: Unable to allocate 32.2 GiB for an array with shape (28709, 224, 224, 3) and data type float64错误,以下是几个实用的解决办法:
降低数据类型:float64类型单元素占8字节,换成float32(4字节)可直接将内存需求减半至16GiB,换成float16(2字节)则只需8GiB,大多数深度学习模型都兼容这两种类型。
代码示例:# 转换已加载数组的数据类型 normalized_data = original_data.astype('float32') # 或在加载时直接指定类型 original_data = np.load('fer_data.npy', dtype='float32')分批处理数据:不要一次性加载并处理全部数据集,改用分批迭代的方式。比如用PyTorch的
DataLoader或TensorFlow的tf.data.Dataset,每次只加载少量样本(如32/64张)完成归一化,处理完一批后自动释放内存。
代码示例(PyTorch):from torch.utils.data import DataLoader, Dataset class FERDataset(Dataset): def __init__(self, data): self.data = data def __len__(self): return len(self.data) def __getitem__(self, idx): # 在获取样本时直接做归一化 img = self.data[idx] / 255.0 # 假设原始是0-255的uint8 return img.astype('float32') loader = DataLoader(FERDataset(raw_data), batch_size=64, shuffle=False) # 分批处理 for batch in loader: # 对当前batch进行后续操作 process_batch(batch)提前在加载阶段做归一化:不要先把所有原始图片加载成大数组再统一归一化,而是在加载单张图片的环节就完成归一化处理,这样内存中始终只保留处理后的单张图片数据,避免原始大数组占用内存。
手动释放冗余内存:检查代码中是否有不再使用的大变量,用
del删除后调用gc.collect()强制触发垃圾回收,释放被占用的内存:import gc # 删除无用变量 del original_data gc.collect()使用内存映射文件:如果上述方法仍不够,可借助numpy的
memmap将数据存储在磁盘上,仅把当前需要处理的部分加载到内存,避免一次性加载整个数据集:# 创建内存映射数组 mapped_data = np.memmap('fer_data.npy', dtype='float32', mode='r+', shape=(28709, 224, 224, 3)) # 分批处理映射数组 for i in range(0, len(mapped_data), 64): batch = mapped_data[i:i+64] / 255.0 process_batch(batch)
内容的提问来源于stack exchange,提问作者Poshan Pandey
相关产品推荐
相关产品推荐

