我试图对图像数据进行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和训练标签进行训练。