免费版Google Colab运行SMOTE过采样时RAM崩溃的原因是什么?
崩溃原因
你当前场景触发RAM崩溃的核心原因是原始图像维度太高:单张1761763的图像展平后有92928维特征,SMOTE基于K近邻实现,处理高维数据时内存开销会随特征维度、样本量呈非线性增长,加上过采样后样本量会数倍提升,直接超出Colab免费运行时的RAM上限。另外你的前置代码存在路径错误:你把数据集复制到了./dataset2/,但后续读取数据的路径设置为WORK_DIR = './dataset',可能意外加载了冗余的旧数据,进一步加剧内存占用。
可行解决方案
- 方案1:优先用类权重替代过采样(无额外内存开销,适配图像场景)
不需要修改现有数据加载逻辑,训练时直接传入类别平衡权重即可抵消类别不平衡的影响,代码示例:
后续模型训练时在from sklearn.utils.class_weight import compute_class_weight import numpy as np import gc # 修正路径错误 WORK_DIR = './dataset2' # 重新加载数据后回收冗余内存 del train_data_gen gc.collect() # 计算平衡类权重 train_labels_cls = train_labels.argmax(axis=1) class_weights = compute_class_weight('balanced', classes=np.unique(train_labels_cls), y=train_labels_cls) class_weight_dict = {i: class_weights[i] for i in range(len(class_weights))}model.fit()中添加参数class_weight=class_weight_dict即可。 - 方案2:降维后再执行SMOTE(必须用过采样时的最优选择)
用预训练模型提取低维图像特征,把9万维的原始像素特征降到2048维以内再做过采样,内存开销直接降低97%以上,代码示例:from tensorflow.keras.applications import InceptionV3 # 加载预训练特征提取器,不包含顶部分类层 feature_extractor = InceptionV3(input_shape=(IMG_SIZE, IMG_SIZE, 3), include_top=False, weights='imagenet', pooling='avg') feature_extractor.trainable = False # 批量提取低维特征 train_features = feature_extractor.predict(train_data, batch_size=32) # 回收原始图像的内存占用 del train_data gc.collect() # 对低维特征执行SMOTE,调小k值进一步降低内存 sm = SMOTE(random_state=42, k_neighbors=3) train_features_resampled, train_labels_resampled = sm.fit_resample(train_features, train_labels) # 后续直接用降维后的过采样特征训练分类层即可,无需还原为图像 - 方案3:升级Colab运行时配置
如果必须在原始像素维度执行SMOTE,可切换到高RAM运行时:点击顶部菜单栏「代码执行程序」→「更改运行时类型」→「运行时规格」选择「高RAM」,免费版高RAM运行时提供25G内存,可覆盖当前场景的内存需求。
内容的提问来源于stack exchange,提问作者user3055051
相关产品推荐
相关产品推荐

