【问题标题】:Fitting a Support Vector Classifier in scikit-learn with image data produces error在 scikit-learn 中使用图像数据拟合支持向量分类器会产生错误
【发布时间】:2018-04-11 14:17:18
【问题描述】:

我正在尝试为图像数据训练 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'

我不确定我缺少哪一步才能以分类器训练所需的形式获取数据。谁能看到可能需要什么?

【问题讨论】:

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


    【解决方案1】:

    您收到的错误信息:

     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 的每个元素,将递归遍历并将 sublist 的所有元素放入上面的列表中。例如

    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 和训练标签进行训练。

    【讨论】:

    • 我知道我忘记添加一些东西了!我用示例更新了问题。希望对您有所帮助!
    • train_set[0] 是我从plt.imread() 函数获得的一张图像的数据。这不是正确的格式吗?
    • 看起来你正在做某事!用train_set[0] 运行它,它给出了这个错误:ValueError: Found array with dim 3. Estimator expected &lt;= 2. 虽然,如果我执行plt.imshow(test_set_[0]) 它仍然可以正确显示图像,这似乎仍然很奇怪。
    • 以最好的方式,imshow 是与 svm 不同的函数,一个显示图像,一个从一组训练数据中学习统计模式,其中一个图像是一个例子,因此它们有不同的要求。 Imshow 需要您呈现给它的格式的数据,scikitlearn.svm 不是!
    • 您能标记为已回答吗?如果没有,我可以提供进一步的帮助吗?
    猜你喜欢
    • 1970-01-01
    • 2016-04-22
    • 2012-08-23
    • 2018-05-26
    • 2017-12-22
    • 2016-05-22
    • 1970-01-01
    • 2016-05-11
    • 2018-06-15
    相关资源
    最近更新 更多