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

构建肺结肠癌CNN分类器遇数组append错误及内存溢出问题

肺与结肠癌分类CNN模型构建的内存优化问题

我正在构建用于肺与结肠癌分类的CNN模型,使用Kaggle的肺与结肠癌病理图像数据集。

基础代码

导入库

import numpy as np
import pandas as pd
from PIL import Image

from glob import glob

import cv2
import gc
import os

数据集路径配置

path = PATH + 'lung_colon_image_set/lung_image_sets'
classes = os.listdir(path)

注:需自行定义PATH以加载数据集。

统计图像数量

for cat in classes:
    image_dir = f'{path}/{cat}'
    images = os.listdir(image_dir)
    print('Images Count: ', len(images))

IMG_SIZE = 256

初始错误:AttributeError

我将X、Y定义为列表,但执行X.append()时出现*AttributeError: 'numpy.ndarray' object has no attribute 'append'*错误,相关代码如下:

X = list()
Y = list()

for i, cat in enumerate(classes):

    images = glob(f'{path}/{cat}/*.jpeg')

    for image in images:
        img = cv2.imread(image)
        #img1 = cv2.resize(img, (IMG_SIZE, IMG_SIZE))
 
        #X = append(X,cv2.resize(img, (IMG_SIZE, IMG_SIZE)))
        #X = np.append(X,cv2.resize(cv2.imread(image), (IMG_SIZE, IMG_SIZE)))
        #X = np.append(X, img1)
        X.append(cv2.resize(img, (IMG_SIZE, IMG_SIZE)))
        Y.append(i)

X = np.asarray(X)

one_hot_encoded_Y = pd.get_dummies(Y).values

尝试多种修正方式(见注释代码)但循环无法结束,错误回溯如下:

NameError                                 Traceback (most recent call last)
Cell In[37], line 16
     10 img = cv2.imread(image)
     11 #img = img.tolist()
     12 #print(type(img))
     13 #img1 = cv2.resize(img, (IMG_SIZE, IMG_SIZE))
     14 #print(type(img1.shape))
---> 16 X.append(cv2.resize(img, (IMG_SIZE, IMG_SIZE)))
     17 #X = np.append(X,cv2.resize(cv2.imread(image),  (IMG_SIZE, IMG_SIZE)))
     18 #X = np.append(X, img1)
     19 #X=np.append(X, cv2.resize(img, (IMG_SIZE, IMG_SIZE)))
     20 #Y=np.append(i, Y)
     22 Y.append(i)

AttributeError: 'numpy.ndarray' object has no attribute 'append'

内存溢出问题(编辑后)

将图像数组转列表后修复了上述错误,但处理约5000-6000张图像(共15000张)时内核崩溃,推测是内存占用过高,代码如下:

for i, cat in enumerate(classes):

    images = glob(f'{path}/{cat}/*.jpeg')

    kk =0 #for tracking only

    for image in images:
    
        kk+=1
        print('kk = ', kk) #tracking
    
        img1 = (cv2.resize(cv2.imread(image), (IMG_SIZE, IMG_SIZE))).tolist()

        X.append(img1)
        Y.append(i)

我无法使用extend(),需要保留图像元素的列表结构;尝试调用gc()无效,且不想减少图像数量,设备为MacBook Pro M1(无GPU),恳请提供内存优化方案。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 10:35:55