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

解决基于EfficientNet+PCA的分类模型单图预测输入形状不匹配问题

解决宫颈细胞图像分类模型的输入形状不兼容问题

错误原因

你的全连接神经网络(sequential_1)训练时接收的是经过EfficientNetB7提取、MinMaxScaler归一化、PCA降维后的15维特征向量,但你直接将原始/预处理后的图像张量(形状(None,32,32,3))输入给它,两者形状不匹配,导致报错。测试流程必须和训练流程完全对齐,跳过中间特征处理步骤必然出错。

正确的单图分类流程

你需要复刻训练时的完整预处理+特征转换 pipeline,步骤如下:

1. 准备训练阶段保存的关键组件

训练时必须保存以下3个组件(如果没保存,需要重新训练并保存):

  • 用于特征提取的EfficientNetB7特征提取器(需去掉顶层分类层,保留特征输出部分)
  • 拟合好的MinMaxScaler对象
  • 拟合好的PCA模型
  • 训练完成的全连接神经网络模型

可以用joblib保存Scaler和PCA:

import joblib
joblib.dump(scaler, 'minmax_scaler.pkl')
joblib.dump(pca, 'pca_model.pkl')

用Keras的save()方法保存特征提取器和全连接模型:

base_model.save('efficientnet_feature_extractor.h5')
fc_model.save('fc_classifier.h5')

2. 测试图像的预处理(与训练集完全一致)

  • 读取PNG图像,转换为RGB格式(EfficientNetB7要求3通道输入,若训练集是灰度图,需复制通道到3层)
  • 调整图像尺寸至训练集使用的尺寸(你训练集是2048×1536,测试图必须resize到相同尺寸,或和训练时输入给EfficientNet的尺寸一致)
  • 应用EfficientNet的官方预处理(和训练时一致):
import cv2
import numpy as np
from tensorflow.keras.applications.efficientnet import preprocess_input

# 读取并处理图像
img = cv2.imread('test_image.png')
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)  # 转RGB
img = cv2.resize(img, (2048, 1536))  # 与训练集尺寸一致
img = preprocess_input(img)  # EfficientNet预处理
img = np.expand_dims(img, axis=0)  # 扩展为批量维度,形状变为(1,2048,1536,3)

3. 特征提取、归一化与降维

加载训练时保存的组件,依次执行特征转换:

from tensorflow.keras.models import load_model
import joblib

# 加载组件
base_model = load_model('efficientnet_feature_extractor.h5')
scaler = joblib.load('minmax_scaler.pkl')
pca = joblib.load('pca_model.pkl')
fc_model = load_model('fc_classifier.h5')

# 提取特征
features = base_model.predict(img)  # 形状为(1, 特征维度),比如EfficientNetB7全局池化后是2560维

# 归一化
scaled_features = scaler.transform(features)

# PCA降维到15维
pca_features = pca.transform(scaled_features)  # 形状变为(1,15)

4. 执行分类预测

将降维后的特征输入全连接模型:

predictions = fc_model.predict(pca_features)
# 根据你的任务处理预测结果,比如取argmax得到类别
pred_class = np.argmax(predictions, axis=1)[0]
print(f"预测类别:{pred_class}")

关键注意事项

  • 所有预处理步骤(尺寸、颜色通道、归一化方式)必须和训练集完全一致,否则特征分布不匹配会导致分类结果失效。
  • 不能在测试数据上重新拟合Scaler或PCA,必须使用训练集拟合好的对象,避免数据泄露。
  • 若训练时对EfficientNetB7的层做了冻结或微调,测试时加载的特征提取器必须保持相同的权重状态。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 21:30:13