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

Google Colab导入图像数据集为数组时因RAM不足崩溃的问题咨询

问题根源

算笔账就知道,你现在的加载方式根本塞不下数据:2400张200020003的图,按代码里的float32精度存,总占用是2400 * 2000 * 2000 * 3 * 4字节 ≈ 112GB。哪怕Colab开到最高档的付费运行时,也凑不出这么大的可用RAM,单靠改两行代码抠内存是不可能解决的,必须从数据加载逻辑和输入尺寸上调整。

可行的解决方案
  • 优先缩图像分辨率,性价比最高
    绝大多数CNN训练根本用不上20002000的原生分辨率,多出来的像素全是冗余信息。你可以在读入图片后立刻缩到常用训练尺寸(256256或者512512),再做格式转换。调整完之后2400张256256的float32数据集总大小才1.8GB,免费版Colab的RAM完全够装,还能顺便加快训练速度。
    这里要注意顺序优化:一定要先对读进来的uint8格式原图做缩放,再转float32、归一化。如果先转float32再缩放,单张图处理时的临时内存峰值会涨到48MB,循环跑不了十几张就会触发OOM;先缩放再转格式,临时内存峰值能降75%以上。
    对应的修改代码:

    import cv2
    Train_data = []
    for img in sorted(glob.glob("path/*.jpg")):
        image= mpimg.imread(img)
        # 读入的原图是uint8格式,直接缩放
        image = cv2.resize(image, (256, 256)) 
        image=np.array(image , dtype='float32') 
        image /= 255.
        Train_data.append(image) 
    Train_data = np.array(Train_data)
    
  • 别全量塞内存,用生成器分批喂数据
    如果你确实要保留2000*2000的原始分辨率训练,完全没必要把所有图一次性读到RAM里。写个迭代式的生成器,每次循环只加载当前训练批次需要的32/64张图,跑完本批次的前向、反向传播,就把这部分图占的内存释放掉就行。全程RAM占用就只有单批次数据的大小,12GB的免费版Colab也能跑高分辨率的数据集。
    重点是一定要删掉原来循环结束后拼成全量Train_data大数组的逻辑,这个大数组就是OOM的核心诱因。

  • 大数组用内存映射读,别全量加载
    如果你已经提前把处理好的数据集存成了npy格式的文件在磁盘上,读的时候加个mmap_mode='r'参数就行:numpy会把磁盘上的大文件按块映射到虚拟内存,访问到哪一块才把哪一块读到物理RAM里,不会硬把100多G的文件全塞到内存里。

  • 临时调Colab的运行时配置
    免费版Colab默认只给12GB左右的RAM,你可以在「运行时-更改运行时类型」里选GPU硬件加速,系统会自动给你分配约25GB的高RAM配额,作为前面方案的辅助补充。但要注意哪怕开到25GB,也还是塞不下全量2000*2000的float32数据集,这个设置救不了全量加载的逻辑。

避坑提醒:免费Colab的会话临时存储是临时的,一旦崩溃所有文件都会丢,记得把数据集提前挂到Google Drive上再加载,别每次重新上传浪费时间。


内容的提问来源于stack exchange,提问作者ZSS

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.22 07:15:04