### 图像分类器“ValueError: 发现维度为3的数组。估计器期望<=2。”

当我尝试使用三个文件夹的数据集运行这段代码时,遇到了这个问题。之前,这个代码在数据集文件夹中只有两个文件夹时运行得非常完美,一个名为normal,另一个名为covid。但在这种情况下,我添加了另一个名为pneumonia的文件夹,使其成为三类图像分类器。我是机器学习的新手,所以我调查了很多关于如何修复这个问题的方法,但每个解决方案都不同,而且代码也不同。我尝试了它们,但它们不起作用,这就是我请求帮助的原因。

这段代码不属于我,它是Adrian Rosebrock的代码,所有的功劳归于他。这是关于将X射线图像分类为COVID或正常病例的代码,但改进这个代码的想法是添加一个新类别来分类有正常(非COVID)肺炎的图像。这就是我为什么在数据集中添加了一个新文件夹。希望你能帮到我,谢谢!

# 使用方法python train.py --dataset dataset
# 导入必要的包from sklearn.preprocessing import LabelBinarizerfrom sklearn.model_selection import train_test_splitfrom sklearn.metrics import classification_reportfrom sklearn.metrics import confusion_matrixfrom imutils import pathsimport numpy as npimport argparseimport cv2import os# 构建参数解析器并解析参数ap = argparse.ArgumentParser()ap.add_argument("-d", "--dataset", required=True,    help="输入数据集的路径")ap.add_argument("-p", "--plot", type=str, default="plot.png",    help="输出损失/准确率图的路径")ap.add_argument("-m", "--model", type=str, default="covid19.model",    help="输出损失/准确率图的路径")args = vars(ap.parse_args())# 初始化初始学习率、训练的轮数、# 和批量大小INIT_LR = 1e-3EPOCHS = 1BS = 8# 获取数据集目录中图像的列表,然后初始化# 数据(即图像)和类别图像列表print("[INFO] 正在加载图像...")imagePaths = list(paths.list_images(args["dataset"]))data = []labels = []# 遍历图像路径for imagePath in imagePaths:    # 从文件名中提取类别标签    label = imagePath.split(os.path.sep)[-2]    # 加载图像,交换颜色通道,并调整大小为固定    # 224x224像素,同时忽略长宽比    image = cv2.imread(imagePath)    image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)    image = cv2.resize(image,(224, 224))    # 分别更新数据和标签列表    data.append(image)    labels.append(label)# 将数据和标签转换为NumPy数组,同时将像素# 强度缩放到[0, 255]范围data = np.array(data) / 255.0labels = np.array(labels)# 对标签执行one-hot编码lb = LabelBinarizer()labels = lb.fit_transform(labels)labels = to_categorical(labels)# 使用80%的数据进行训练,剩余20%用于测试,将数据分成训练和测试集(trainX, testX, trainY, testY) = train_test_split(data, labels,    test_size=0.20, stratify=labels, random_state=42)

这是错误消息:

[INFO] 正在加载图像...Traceback (most recent call last):  File "train_covid19.py", line 77, in <module>    test_size=0.20, stratify=labels, random_state=42)  File "C:\Users\KQ\anaconda3\lib\site-packages\sklearn\model_selection\_split.py", line 2143, in train_test_split    train, test = next(cv.split(X=arrays[0], y=stratify))  File "C:\Users\KQ\anaconda3\lib\site-packages\sklearn\model_selection\_split.py", line 1737, in split    y = check_array(y, ensure_2d=False, dtype=None)  File "C:\Users\KQ\anaconda3\lib\site-packages\sklearn\utils\validation.py", line 574, in check_array    % (array.ndim, estimator_name))ValueError: 发现维度为3的数组。估计器期望<=2.

回答:

我认为你不需要同时使用LabelBinarizerto_categorical。它们做的是同样的事情,所以你只需要其中一个。尝试删除对to_categorical的调用。

lb = LabelBinarizer()labels = lb.fit_transform(labels)labels = to_categorical(labels)  # 删除这行代码。

你还需要更新模型中的类别数量。

# 将大小从2改为3.headModel = Dense(3, activation="softmax")(headModel)

为了避免每次添加或删除类别时都需要更改这个,你可以计算唯一标签的数量。

n_labels = len(set(labels))headModel = Dense(n_labels, activation="softmax")(headModel)

更新

还要注意的是,to_categorical只能在整数标签上工作。这使它更像OneHotEncoder而不是LabelBinarizer

这是一个调用所有内容的示例。

labels = [0, 1, 0, 2]                                                                                                                                                                                                               lb = LabelBinarizer() binarized = lb.fit_transform(labels)                                                                                                                                                                                                binarized                                                                                                                                                                                                                           # array([[1, 0, 0],#        [0, 1, 0],#        [1, 0, 0],#        [0, 0, 1]])to_categorical(labels)                                                                                                                                                                                                              # array([[1., 0., 0.],#        [0., 1., 0.],#        [1., 0., 0.],#        [0., 0., 1.]], dtype=float32)to_categorical(binarized)                                                                                                                                                                                                           # array([[[0., 1.],#         [1., 0.],#         [1., 0.]],# #        [[1., 0.],#         [0., 1.],#         [1., 0.]],# #        [[0., 1.],#         [1., 0.],#         [1., 0.]],# #        [[1., 0.],#         [1., 0.],#         [0., 1.]]], dtype=float32)

请注意,对于标签的三维输出,因为它试图对已经进行过one-hot编码的数据的三个部分进行one-hot编码,增加了一个额外的维度,这是train_test_split无法处理的。

这就是你得到ValueError: 发现维度为3的数组。的原因

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注