在scikit中拟合支持向量分类器 - 学习图像数据会产生错误

时间:2017-10-30 14:41:07

标签: machine-learning scikit-learn classification svm multilabel-classification

我正在尝试为图像数据训练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]),则图像会在输出中正确显示。

我还从train_test_split致电scikit-learn

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'

我不确定我缺少哪一步以获得分类器需要的数据来训练它。任何人都可以看到可能需要的东西吗?

1 个答案:

答案 0 :(得分:0)

您收到的错误消息:

 ValueError: setting an array element with a sequence,

通常会在您尝试将列表放在需要单个值的位置时产生。这会告诉我你的train_set由多维元素列表组成,尽管你确实声明你的输入是列表。您能否发布输入和标签的示例?

UPDATE 是的,就像我想的那样。训练数据的第一个元素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和训练标签进行训练。