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

训练的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 13:05:19