使用VGG16提取特征供SVM做图像分类时标签维度报错如何解决?
SVM分类标签形状不匹配报错解决方案
报错的核心是sklearn中svm.SVC的fit方法要求输入的标签y为1维的类别整数数组,你当前的标签是3分类对应的独热编码格式,形状为(14630,3),不符合输入要求。
解决方案(二选一即可)
方案1:修改数据生成器参数(推荐)
直接从生成环节输出符合要求的1维标签,修改两处代码即可:
- 将标签初始化代码
labels = np.zeros(shape=(sample_count,3))改为labels = np.zeros(shape=(sample_count,)) - 将
flow_from_directory方法中的class_mode='categorical'改为class_mode='sparse',生成器会直接输出1维的类别整数标签,无需额外转换。
修改后的完整特征提取代码如下:
def extract_features(directory, sample_count): features = np.zeros(shape=(sample_count, 7, 7, 512)) # 标签改为1维 labels = np.zeros(shape=(sample_count,)) # class_mode改为sparse,直接输出整数标签 generator = ImageDataGenerator(rescale=1./255).flow_from_directory(directory,target_size=(224, 224),batch_size = batch_size, class_mode='sparse') i = 0 print('Entering for loop...') for inputs_batch, labels_batch in generator: features_batch = model.predict(inputs_batch) features[i * batch_size : (i + 1) * batch_size] = features_batch labels[i * batch_size : (i + 1) * batch_size] = labels_batch i += 1 if i * batch_size >= sample_count: break return features, labels
方案2:对已有独热编码做转换
如果不想改动特征提取的原有逻辑,可在调用clf.fit之前,用np.argmax把独热编码转换为1维类别索引:
# 把独热编码转为类别索引,axis=1表示按行取最大值的下标 train_labels = np.argmax(train_labels, axis=1) validation_labels = np.argmax(validation_labels, axis=1)
特征形状说明
你当前已经将train_featuresreshape为(14630, 25088)的二维数组,完全符合SVC输入X要求的「样本数×特征数」格式,无需额外调整。
内容的提问来源于stack exchange,提问作者wang chaoyu
相关产品推荐
相关产品推荐

