You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

归一化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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 14:05:46