【问题标题】:ValueError: setting an array element with a sequence()ValueError:使用序列()设置数组元素
【发布时间】:2018-08-04 08:43:19
【问题描述】:

在否决这个问题并标记为重复之前,让我解释一下这个问题,我 在堆栈上尝试了所有具有类似问题的可能解决方案, 但他们都没有工作。我也查了,setting an array element with a sequence" error could be improved. #6584

所以我在 3 个不同的特征上训练一个随机森林分类器,它们都具有不同的维度,但我将它们重塑为 (-1,1),这可以适合训练 RF(随机森林)模型,但它会继续提供同样的错误一次又一次,因为我已经尝试了所有可能的事情,这里是正在使用的功能列表,

在这里,我通过简单地取平均值/平均值来计算颜色特征 不同颜色空间的图像,这里正在研究 RGB、LAB、HSV 和 分别是灰色图像,从下面的代码中,我已将所有图像展平 可能的特征向量数组,来自不同的颜色空间。

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.

【问题讨论】:

  • 你遗漏了最重要的事情。 您的异常回溯在哪里? 此外,寻求帮助调试的问题必须包含minimal reproducible example 以重现问题。这不是最小的。显然,所有这些被注释掉的代码行都与这个错误无关。这只是噪音。当您想了解和修复错误时,通过消除创建一个最小示例是必不可少的。
  • @HåkenLid 感谢您的建议,帖子已修改。
  • 当您收到此错误时,_data_labels 是什么?这些变量不会在您的问题的其他地方使用。
  • 确保您传递了预期的参数类型。不幸的是,像 scikit 这样的库经常有非常无信息的错误消息。 scikit-learn.org/stable/modules/generated/…
  • @HåkenLid 没关系,我检查了一下,这不是 sklearn 的问题,而是关于 numpy 数组的问题,请参阅此问题,github.com/numpy/numpy/issues/6584

标签: python arrays numpy random-forest scikit-image


【解决方案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]])

在traceback变量名发生变化,但我猜问题可以追溯到你给fit_data变量。你没有展示创建_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://stackoverflow.com/search?q=user%3A901925+ValueError%2Bsequence

【讨论】:

  • 感谢您的回答,但让我解释一下我是如何制作 _data 和 _labels 的,它是一个列表,其中包含每个图像的特征,从每个图像计算的特征被附加到 _data 列表中,稍后提供给RF 适合训练,但我会发布 _data 的内容,以便更具体!
  • np.array(_data) 产生什么?
  • 即简单的将一个列表类型转换为numpy数组格式,_data就是一个列表。
  • dtype 是什么?我应该问一下,np.array(_data, dtype=float) 是什么。
  • 我将_data中的所有值都转换为float,dtype表示要转换的类型。
猜你喜欢
  • 2011-06-08
  • 2019-08-04
  • 2019-11-20
相关资源
最近更新 更多