使用scikit-learn对图像数据进行支持向量分类器拟合时出现错误

我试图对图像数据进行SVC分类器的训练。然而,当我运行以下代码时:

classifier = svm.SVC(gamma=0.001)classifier.fit(train_set, train_set_labels)

我得到了以下错误:

ValueError: setting an array element with a sequence.

我使用Matplotlib将图像转换为数组:plt.imread(image)

错误似乎表明数据不是数组,但当我检查数据和标签的类型时,它们都是列表(我手动将标签数据添加到列表中):

print(type(train_set))print(type(train_set_labels))<class 'list'><class 'list'>

如果我执行plt.imshow(items[0]),图像会在输出中正确显示。

我还从scikit-learn中调用了train_test_split

train_set, test_set = train_test_split(items, test_size=0.2, random_state=42)

示例输入:

train_set[0]array([[[212, 134,  34],    [221, 140,  48],    [240, 154,  71],    ...,     [245, 182,  51],    [235, 175,  43],    [242, 182,  50]],   [[230, 152,  51],    [222, 139,  47],    [236, 147,  65],    ...,     [246, 184,  49],    [238, 179,  43],    [245, 186,  50]],   [[229, 150,  47],    [205, 122,  28],    [220, 129,  46],    ...,     [232, 171,  28],    [237, 179,  35],    [244, 188,  43]],   ...,    [[115, 112, 103],    [112, 109, 102],    [ 80,  77,  72],    ...,     [ 34,  25,  28],    [ 55,  46,  49],    [ 80,  71,  74]],   [[ 59,  56,  47],    [ 66,  63,  56],    [ 48,  45,  40],    ...,     [ 32,  23,  26],    [ 56,  47,  50],    [ 82,  73,  76]],   [[ 29,  26,  17],    [ 41,  38,  31],    [ 32,  29,  24],    ...,     [ 56,  47,  50],    [ 59,  50,  53],    [ 84,  75,  78]]], dtype=uint8)

示例标签:

 train_set_labels[0] 'Picasso'

我不确定我遗漏了什么步骤才能将数据转换为分类器训练所需的形式。有人能看出可能需要什么吗?


回答:

您收到的错误消息:

 ValueError: setting an array element with a sequence,

通常是在尝试将列表放入需要单个值的地方时出现的。这表明您的train_set是由多维元素的列表组成的,尽管您确实表示您的输入是列表。您能发布一个您的输入和标签的示例吗?

更新是的,正如我所想。您的训练数据的第一个元素,train_set[0],对应于一个很长的列表(我无法判断有多长),每个元素由一个包含3个元素的列表组成。因此,您是在一个列表的列表的列表上调用分类器,而分类器需要一个列表的列表(m行对应于训练样本的数量,每行由n个特征的列表组成)。您的train_set数组中还有什么?整个数据集是否都在train_set[0]中?如果是的话,您需要创建一个新数组,每个元素对应于train_set[0]的子元素,然后我相信您的代码应该可以运行,尽管我对那个分类器不太熟悉。或者您可以尝试用train_set[0]运行分类器。

更新2

我对scikit-learn.svc没有经验,所以我无法告诉您预处理数据以使其适合算法的最佳方法,但一种方法是像我之前说的,对于train_set的每个元素,由列表的列表组成,递归遍历并将子列表的所有元素放入上面的列表中。例如

new_train_set = []    for i in range(len(train_set)):        for j in range(len(train_set[i]):        new_train_set.append([train_set[i,j])

然后我会用new_train_set和训练标签进行训练。

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中创建了一个多类分类项目。该项目可以对…

发表回复

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