在 scikit-learn 中使用图像数据拟合支持向量分类器会产生错误
Fitting a Support Vector Classifier in scikit-learn with image data produces error
我正在尝试为图像数据训练 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 是由一个多维元素列表组成的,尽管你确实声明你的输入是列表。您能否 post 您的输入和标签的示例?
更新
是的,跟我想的一样。你的训练数据的第一个元素,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 和训练标签进行训练。
我正在尝试为图像数据训练 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 是由一个多维元素列表组成的,尽管你确实声明你的输入是列表。您能否 post 您的输入和标签的示例?
更新 是的,跟我想的一样。你的训练数据的第一个元素,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 和训练标签进行训练。