sklearn KNeighborsClassifier四维数组维度报错修复方案
问题原因
两个报错都是输入数组形状不符合scikit-learn接口要求导致的:
- 第一个报错
Found array with dim 4. Estimator expected <= 2:KNN分类器的特征输入必须是二维数组,格式为(样本总数, 单个样本的特征数),你传入的原始图像数组是4维张量(80, 128, 128, 3),对应80张128*128的3通道彩色图,没有把单张图的像素展平为一维特征,不符合输入要求。 - 第二个报错
Found input variables with inconsistent numbers of samples:你之前用reshape(-1,1)处理数组时,把所有像素点拆成了独立样本,处理后训练集样本数变成了80*128*128*3=3932160,和标签数组的样本数完全不匹配。另外你生成的标签数组本身形状也有问题,拼接后是(2,40)的二维数组,不是要求的一维标签格式。
修复步骤
- 正确展平图像特征:reshape时保留第一维的样本数量,把单张图像的所有维度展平为一维特征
# 训练集特征形状从(80,128,128,3)转为(80, 49152) X_train = arr.reshape(arr.shape[0], -1) # 测试集特征形状从(20,128,128,3)转为(20, 49152) X_test = arr2.reshape(arr2.shape[0], -1) - 修正标签数组形状:把二维的标签数组展平为一维,保证样本数和训练集一一对应
# 标签形状从(2,40)转为(80,),前40个值为1、后40个值为2 y_train = arr3.reshape(-1) - 重新执行训练预测
knn = KNeighborsClassifier(n_neighbors=3) knn.fit(X_train, y_train) res = knn.predict(X_test) print(res)
注意:要确认训练集数组的拼接顺序是40张类别1图像+40张类别2图像,和标签顺序完全对应,否则会出现标签错位导致模型预测失效。
内容的提问来源于stack exchange,提问作者ryand
相关产品推荐
相关产品推荐

