使用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

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

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