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 следующее создает objectdtype массив; с числовым 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

Другие вопросы по тегам