Google Colab运行相同CNN代码准确率远低于本地环境问题咨询
车辆颜色分类CNN模型本地与Colab准确率差异原因分析
问题背景
用于车辆颜色分类的CNN实现代码如下:
def cnn(trainImages, trainLabels, testImages, testLabels): trainImages = np.array(trainImages) trainLabels = np.array(trainLabels) testImages = np.array(testImages) testLabels = np.array(testLabels) trainImages = trainImages / 255 testImages = testImages / 255 model = Sequential() model.add(Conv2D(filters = 32, kernel_size = (3, 3), padding = 'same', activation = 'relu', input_shape = (224, 224, 3))) model.add(MaxPool2D(pool_size = (2, 2), strides = (2, 2))) model.add(Conv2D(filters = 64, kernel_size = (3, 3), padding = 'same', activation = 'relu')) model.add(MaxPool2D(pool_size = (2, 2), strides = (2, 2))) model.add(Conv2D(filters = 128, kernel_size = (3, 3), padding = 'same', activation = 'relu')) model.add(MaxPool2D(pool_size = (2, 2), strides = (2, 2))) model.add(Flatten()) model.add(Dense(256, activation = 'relu')) model.add(Dense(9)) opt = Adam(learning_rate = 0.001) model.compile(optimizer = opt, loss = tensorflow.keras.losses.SparseCategoricalCrossentropy(from_logits = True), metrics = ['accuracy']) model.fit(trainImages, trainLabels, epochs = 20, batch_size = 64) predictionResult = model.predict(testImages) pred = [] for i in range(len(predictionResult)): pred.append(np.argmax(predictionResult[i], axis = -1)) vehicles = ['Black Vehicles', 'Blue Vehicles', 'Brown Vehicles', 'Green Vehicles', 'Pink Vehicles', 'Red Vehicles', 'Silver Vehicles', 'White Vehicles', 'Yellow Vehicles'] print('Accuracy: ', metrics.accuracy_score(testLabels, pred)) print(metrics.classification_report(testLabels, pred, target_names = vehicles)) print(metrics.confusion_matrix(testLabels, pred))
该模型本地运行测试集准确率可达93%,在Google Colab平台运行时最终测试准确率仅为10%,训练过程中前3个epoch训练准确率快速从10%上升到90%以上。
诱因分析
- 测试集图像与标签顺序不匹配:9类分类任务随机猜测准确率约为11%,与观测到的10%测试准确率高度吻合。如果Colab环境加载测试集时,图像的读取顺序和对应标签的存储顺序不一致,会导致预测结果和真实标签完全无法对齐,出现接近随机的准确率,这是最高概率的诱因。
- 标签编码映射不一致:本地训练时的类别编码顺序(如0对应黑车、1对应蓝车)如果和Colab环境下的编码顺序不一致,即使模型预测正确,后续调用
classification_report时传入的vehicles列表顺序和Colab的标签编码不匹配,也会导致准确率计算结果错误。 - 数据集划分逻辑差异:本地运行时可能设置了固定随机种子来划分训练/测试集,保证分布一致;如果Colab运行时没有设置相同的随机种子,可能出现训练集和测试集分布严重偏移,最终泛化效果极差。
- 图像输入通道顺序错误:如果本地用OpenCV读取图像(默认BGR通道顺序),Colab上用PIL读取图像(默认RGB通道顺序),输入模型的颜色通道完全颠倒,会导致模型初始学习速度慢,即使训练集准确率上升,也无法泛化到测试集。
- 框架版本差异:本地TensorFlow/Keras版本与Colab默认版本不同,部分API的默认参数发生变化(如卷积层的初始化策略、Adam优化器的默认参数、损失函数的计算逻辑等),都会导致训练效果不一致。
- 预处理逻辑不一致:如果本地加载的原始图像是uint8类型(0-255取值),代码中
/255归一化逻辑正确;如果Colab环境读取的图像已经被预处理为0-1取值范围,再次/255会将输入压缩到0-0.0039的极小范围,模型很难学习到有效特征,最终泛化能力差。
内容的提问来源于stack exchange,提问作者Fane Spoitoru
相关产品推荐
相关产品推荐

