训练的CNN模型对新输入图像预测结果始终一致问题求助
问题:模型训练集表现完美,但新图像预测结果固定
训练的图像分类模型在训练集上准确率达0.9975,对训练图像预测正常,但输入任意新图像时,预测结果始终为[7]。
数据预处理代码
X_train = np.array(X_train) X_test = np.array(X_test) X_train = np.expand_dims(X_train, axis=3) X_test = np.expand_dims(X_test, axis=3)
模型结构代码
weight_decay = 1e-4 num_classes = 12 model = Sequential() model.add(Conv2D(64, (4,4), padding='same', kernel_regularizer=regularizers.l2(weight_decay), input_shape=(128,128,1))) model.add(Activation('elu')) model.add(BatchNormalization()) model.add(Conv2D(64, (4,4), padding='same', kernel_regularizer=regularizers.l2(weight_decay))) model.add(Activation('elu')) model.add(BatchNormalization()) model.add(MaxPooling2D(pool_size=(2,2))) model.add(Dropout(0.2)) model.add(Conv2D(128, (4,4), padding='same', kernel_regularizer=regularizers.l2(weight_decay))) model.add(Activation('elu')) model.add(BatchNormalization()) model.add(Conv2D(128, (4,4), padding='same', kernel_regularizer=regularizers.l2(weight_decay))) model.add(Activation('elu')) model.add(BatchNormalization()) model.add(MaxPooling2D(pool_size=(2,2))) model.add(Dropout(0.3)) model.add(Conv2D(128, (4,4), padding='same', kernel_regularizer=regularizers.l2(weight_decay))) model.add(Activation('elu')) model.add(BatchNormalization()) model.add(Conv2D(128, (4,4), padding='same', kernel_regularizer=regularizers.l2(weight_decay))) model.add(Activation('elu')) model.add(BatchNormalization()) model.add(MaxPooling2D(pool_size=(2,2))) model.add(Dropout(0.4)) model.add(Flatten()) model.add(Dense(128, activation="linear")) model.add(Activation('elu')) model.add(Dense(num_classes, activation='softmax')) model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy']) model.fit(X_train, y_train, epochs=5, validation_data=(X_test,y_test), verbose = 1, initial_epoch=0)
训练集测试代码及结果
predicted_classes = model.predict(X_train[:,:,:,:]) predicted_classes = np.argmax(np.round(predicted_classes), axis=1) k = X_train.shape[0] #18000 r = np.random.randint(k) #random in 18000 print("Prediction:", predicted_classes[4])
Prediction: 8
新图像测试代码及结果
imgTest = tf.keras.utils.load_img('/content/drive/My Drive/Colab Notebooks/finger.jpg') imgTest = np.array(imgTest) imgTest = cv2.cvtColor(imgTest, cv2.COLOR_BGR2GRAY) imgTest = cv2.resize(imgTest, (128, 128)) imgTest = np.expand_dims(imgTest, axis=0) # imgTest = imgTest/255 print(imgTest.shape) predicted_classes_test = model.predict(imgTest) predicted_classes_test = np.argmax(np.round(predicted_classes_test), axis=1) print("Prediction:", predicted_classes_test)
Prediction: [7]
问题原因及解决方案
1. 输入维度不匹配
模型输入要求是(128,128,1),但新图像处理后形状是(1,128,128),缺少最后一个通道维度。需要在处理时添加通道维度:
imgTest = np.expand_dims(imgTest, axis=3) # 最终形状为(1,128,128,1)
2. 数据归一化缺失
训练集与新图像的预处理逻辑必须完全一致。如果训练时X_train做了归一化(比如除以255),但新图像跳过了这一步,会导致模型输入数据分布严重偏离训练时的分布,进而输出异常。需要恢复归一化步骤:
imgTest = imgTest / 255.0
3. 潜在的训练数据问题
训练集准确率接近100%,需排查以下情况:
- 训练集是否存在标签错误或数据泄露(比如测试集样本混入训练集)
- 数据集类别分布是否极度不平衡,导致模型偏向某一高频类别
- 验证集准确率是否同样偏高,如果验证集准确率远低于训练集,说明模型严重过拟合
修正后的新图像测试代码
imgTest = tf.keras.utils.load_img('/content/drive/My Drive/Colab Notebooks/finger.jpg') imgTest = np.array(imgTest) imgTest = cv2.cvtColor(imgTest, cv2.COLOR_BGR2GRAY) imgTest = cv2.resize(imgTest, (128, 128)) imgTest = np.expand_dims(imgTest, axis=0) imgTest = np.expand_dims(imgTest, axis=3) # 添加单通道维度 imgTest = imgTest / 255.0 # 归一化到0-1区间 print(imgTest.shape) # 输出应为(1,128,128,1) predicted_classes_test = model.predict(imgTest) predicted_classes_test = np.argmax(predicted_classes_test, axis=1) print("Prediction:", predicted_classes_test)
内容的提问来源于stack exchange,提问作者Krulcifer
相关产品推荐
相关产品推荐

