ValueError: установка элемента массива с помощью sequence()
Прежде чем опустить этот вопрос и отметить его как дубликат, позвольте мне объяснить проблему, я попробовал все возможные решения с похожим вопросом здесь, в стеке, но ни один из них не сработал. Я также проверил, установка элемента массива с ошибкой "последовательность может быть улучшена. #6584
Итак, я тренирую классификатор случайных лесов по 3 различным функциям, все с разными измерениями, но я изменил их до (-1,1), что может быть пригодно для обучения модели RF(случайный лес), но он продолжает давать ту же ошибку снова и снова, поскольку я перепробовал все возможные вещи, вот список функций, которые я использую,
здесь я вычисляю цветовые особенности, просто беря среднее / среднее для изображений в разных цветовых пространствах, здесь я работаю над изображениями RGB,LAB,HSV и GREY соответственно, так как из приведенного ниже кода я выровнял все возможные массивы векторов объектов из разные цветовые пространства.
def extract_color_feature(rgb_roi, lab_roi, hsv_roi, gray_roi):
avg_rgb_per_row = np.average(rgb_roi, axis=0)
avg_rgb = np.average(avg_rgb_per_row, axis=0).flatten()
avg_lab_per_row = np.average(lab_roi, axis=0)
avg_lab = np.average(avg_lab_per_row, axis=0).flatten()
h, s, _ = cv2.split(hsv_roi)
h_avg = cv2.mean(h)
s_avg = cv2.mean(s)
avg_hs = np.hstack([h_avg, s_avg]).flatten()
lbp = extract_lbp(gray_roi).flatten()
avg_rgb = np.array(avg_rgb, dtype=np.float32).flatten()
avg_lab = np.array(avg_lab, dtype=np.float32).flatten()
avg_hs = np.array(avg_hs, dtype=np.float32).flatten()
lbp = np.array(lbp, dtype=np.float32).flatten()
avg_color = np.hstack([avg_rgb, avg_lab, avg_hs, lbp])
return avg_color.flatten()
в следующей функции я снова вычислял только значения гистограммы из разных цветовых пространств: RGB,LAB,HSV. так как каждая гистограмма здесь выполняется на одноцветном канале, глубина каждой функции гистограммы всегда будет равна 1.
def compute_hist_feature(rgb_seg, hsv_seg, lab_seg, mask):
b, g, r = cv2.split(rgb_seg)
h, s, v = cv2.split(hsv_seg)
l, a, b = cv2.split(lab_seg)
r_equ = cv2.equalizeHist(r)
g_equ = cv2.equalizeHist(g)
b_equ = cv2.equalizeHist(b)
r_hist = cv2.calcHist([r_equ], [0], mask, [8],
[0, 256]).flatten()
g_hist = cv2.calcHist([g_equ], [0], mask, [8],
[0, 256]).flatten()
b_hist = cv2.calcHist([b_equ], [0], mask, [8],
[0, 256]).flatten()
l_hist = cv2.calcHist([l], [0], mask, [8],
[0, 256]).flatten()
a_hist = cv2.calcHist([a], [0], mask, [8],
[0, 256]).flatten()
bb_hist = cv2.calcHist([b], [0], mask, [8],
[0, 256]).flatten()
h_hist = cv2.calcHist([h], [0], mask,
[8], [0, 256]).flatten()
s_hist = cv2.calcHist([s], [0], mask,
[8], [0, 256]).flatten()
h_hist = np.array(h_hist, dtype=np.float32).flatten()
r_hist = np.array(r_hist, dtype=np.float32).flatten()
g_hist = np.array(g_hist, dtype=np.float32).flatten()
b_hist = np.array(b_hist, dtype=np.float32).flatten()
s_hist = np.array(s_hist, dtype=np.float32).flatten()
l_hist = np.array(l_hist, dtype=np.float32).flatten()
a_hist = np.array(a_hist, dtype=np.float32).flatten()
bb_hist = np.array(bb_hist, dtype=np.float32).flatten()
hist = np.hstack([r_hist, g_hist, b_hist, h_hist, s_hist, l_hist, a_hist, bb_hist])
return hist.flatten()
и, наконец, я использую пространственные объекты, просто сгладив список (x,y), чтобы сформировать массив объектов, который будет соответственно представлять местоположение.
cords = [t[::-1] for t in clusters_.get(disc)] # reversing the list of tuples
disc_pts = np.array(cords, dtype=np.int32)
loc_feat = np.array(cords, dtype=np.float32).flatten()
здесь изначально шнуры представляют собой массив глубиной 2, потому что каждый пиксель имеет два кордината, поэтому, я сплющил его, чтобы сформировать массив глубиной 1.
наконец, я сложил все три объекта, чтобы сформировать один вектор объектов,
feat_vec = np.hstack([loc_feat, color_feat, hist_feat]).flatten()
здесь я вручную проверил элементы во всех трех векторах признаков, чтобы подтвердить dtype, размеры массива не являются неоднозначными, чтобы вызвать ошибку, но все выглядит хорошо для меня.
это первый, функция определения местоположения
[ 82. 209. 82. 210. 83. 210. 82. 211. 83. 211. 82. 212.
83. 212. 84. 212. 81. 213. 82. 213. 83. 213. 84. 213.
81. 214. 82. 214. 83. 214. 84. 214. 81. 215. 82. 215.
83. 215. 84. 215. 81. 216. 82. 216. 83. 216. 84. 216.
81. 217. 82. 217. 83. 217. 84. 217. 81. 218. 82. 218.
83. 218. 84. 218. 85. 218. 81. 219. 82. 219. 83. 219.
84. 219. 85. 219. 81. 220. 82. 220. 83. 220. 84. 220.
85. 220. 81. 221. 82. 221. 83. 221. 84. 221. 85. 221.
81. 222. 82. 222. 83. 222. 84. 222. 85. 222. 86. 222.
81. 223. 82. 223. 83. 223. 84. 223. 85. 223. 86. 223.
81. 224. 82. 224. 83. 224. 84. 224. 85. 224. 86. 224.
81. 225. 82. 225. 83. 225. 84. 225. 85. 225. 86. 225.
87. 225. 81. 226. 82. 226. 83. 226. 84. 226. 85. 226.
86. 226. 87. 226. 81. 227. 82. 227. 83. 227. 84. 227.
85. 227. 86. 227. 87. 227. 82. 228. 83. 228. 84. 228.
85. 228. 86. 228. 87. 228. 82. 229. 83. 229. 84. 229.
85. 229. 86. 229. 87. 229. 82. 230. 83. 230. 84. 230.
85. 230. 86. 230. 87. 230. 82. 231. 83. 231. 84. 231.
85. 231. 86. 231. 87. 231. 82. 232. 83. 232. 84. 232.
85. 232. 86. 232. 87. 232. 82. 233. 83. 233. 84. 233.
85. 233. 86. 233. 87. 233. 88. 233. 83. 234. 84. 234.
85. 234. 86. 234. 87. 234. 88. 234. 83. 235. 84. 235.
85. 235. 86. 235. 87. 235. 88. 235. 83. 236. 84. 236.
85. 236. 86. 236. 87. 236. 88. 236. 83. 237. 84. 237.
85. 237. 86. 237. 87. 237. 88. 237. 84. 238. 85. 238.
86. 238. 87. 238. 84. 239. 85. 239. 86. 239. 87. 239.
84. 240. 85. 240. 86. 240. 87. 240. 84. 241. 85. 241.
86. 241. 87. 241. 85. 242. 86. 242. 87. 242. 85. 243.
86. 243.]
это цветовой вектор
[ 3.35917592e-01 3.25945705e-01 3.25065553e-01 3.34438205e-01
2.04288393e-01 1.97153553e-01 1.85440078e-01 0.00000000e+00
0.00000000e+00 0.00000000e+00 1.32209742e-02 0.00000000e+00
0.00000000e+00 0.00000000e+00 2.62172282e-04 3.93258437e-04
1.31086141e-04 9.36329598e-05 0.00000000e+00 0.00000000e+00
0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00
0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00
0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00
0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00
0.00000000e+00 0.00000000e+00 9.98417616e-01 7.02247198e-04]
и это вектор гистограммы
[ 0. 0. 0. 0. 0. 0. 0. 169. 0. 0. 0. 0.
0. 0. 0. 169. 0. 163. 6. 0. 0. 0. 0. 0.
0. 0. 0. 169. 0. 0. 0. 0. 169. 0. 0. 0.
0. 0. 0. 0. 0. 0. 0. 0. 0. 29. 93. 47.
0. 0. 0. 0. 169. 0. 0. 0. 0. 0. 0. 169.
0. 0. 0. 0.]
как можно видеть, тип данных и размеры всех трех массивов одинаковы, но все равно возникает ошибка при обучении с помощью классификатора RF или SVC, также, когда я не использую функцию определения местоположения и тренируюсь только с функциями цвета и гистограммы, тогда не генерировать ошибку, и программа обучения и прогнозирования работает нормально. но только когда все три функции сложены, это дает ошибку.
ошибка генерируется, когда для обучения установлен RF-классификатор. Здесь _data - это список векторов объектов ( ~feat_vec~), которые были вычислены ранее. и _labels - соответствующие метки 1 или 0 для каждой выборки данных (изображения) соответственно.
model = RandomForestClassifier(n_estimators=100, random_state=42)
model.fit(_data, _labels)
полная трассировка ошибок назад:
Traceback (most recent call last):
File "~/openCV/saliency_detection/svm_train.py", line 59, in <module>
model.fit(_data, _labels)
File "/usr/lib/python2.7/site-packages/sklearn/ensemble/forest.py", line 247, in fit
X = check_array(X, accept_sparse="csc", dtype=DTYPE)
File "/usr/lib/python2.7/site-packages/sklearn/utils/validation.py", line 382, in check_array
array = np.array(array, dtype=dtype, order=order, copy=copy)
ValueError: setting an array element with a sequence.
1 ответ
Скорее всего, ошибка вызвана попыткой создать массив из списков или массивов различной длины.
Без dtype
следующее создает object
dtype
массив; с числовым dtype
это поднимает эту ошибку.
In [33]: np.array([[1,2,3],[4,5,6],[7,8,9,10]])
Out[33]:
array([list([1, 2, 3]), list([4, 5, 6]), list([7, 8, 9, 10])],
dtype=object)
In [34]: np.array([[1,2,3],[4,5,6],[7,8,9,10]], dtype=int)
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-34-677fde45dbde> in <module>()
----> 1 np.array([[1,2,3],[4,5,6],[7,8,9,10]], dtype=int)
ValueError: setting an array element with a sequence.
Он не может создать двумерный числовой массив из 3 списков разной длины.
In [37]: np.array([[1,2,3],[4,5,6],[7,8,9]], dtype=int)
Out[37]:
array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
В трассировке имена переменных меняются, но я предполагаю, что проблема может быть прослежена до _data
переменная, которую вы даете fit
, Вы не показываете код, который создает _data
, но дать только смутное описание:
_data - список векторов объектов ( ~feat_vec~)
По вашим отпечаткам это выглядит как цвет, а гистограмма имеет около 80 значений. но у местоположения явно есть намного больше. Это соответствует вашему утверждению, что
также, когда я не использую функцию определения местоположения и тренируюсь только с цветными и гистограммными функциями, это не выдает ошибку, и программа обучения и прогнозирования работает отлично. но только когда все три функции сложены, это дает ошибку.
Тот факт, что вы можете hstack
они ничего не говорят нам о том, как они будут работать в np.array(....)
,
In [35]: np.hstack([[1,2,3],[4,5,6],[7,8,9,10]])
Out[35]: array([ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
Вот список предыдущих раз, когда я отвечал на вопрос об этой же ValueError:
https://stackru.com/search?q=user%3A901925+ValueError%2Bsequence