mxnet: setting an array element with a sequence

    技术2025-05-30  12

    mxnet: setting an array element with a sequence

    发现问题分析问题解决问题

    发现问题

    在跑mxnet的时候发现报错:

    ValueError: setting an array element with a sequence

    对应语句为:

    std_weights = nd.array(1 + p_std, ctx=ctx)

    分析问题

    (如果不想看详细解决过程,可以直接看最后的粗体字) 首先,在运行该项目时,我分不清numpy和mxnet.nd的区别。感觉这两个类型的数据总是混在一起,怀疑是不是数据类型的问题。 看报错部分的代码:

    std_weights = nd.array(1 + p_std, ctx=ctx)

    首先要确定p_std的数据类型,看它的定义:

    p_std = (np.var(p_hist, axis=0) + (np.var(p_hist, axis=0)**2)/(p_hist.shape[0] - 1))**.5

    这么长,说白了就是一个np.var操作,对象为p_hist,为了确认p_hist的类型,再看它的定义:

    p_hist = prediction_history[:, batch_id * args.batch_size: (batch_id + 1) * args.batch_size, :]

    可以看到p_hist来源于prediction_history,为nd.array类型。那么p_hist也就是nd.array类型。我们用np.var()方法对一个nd.array类型数据进行操作,估计是这里出了数据类型的问题。

    解决问题

    按照老习惯,用一个简单的例子来复现bug,并在简单例子中debug:

    import numpy as np from mxnet import nd a = nd.array([[1,2,3], [2,3,4]]) b = np.var(a) c = nd.array(b + 1)

    上述代码报了同样的错,打印中间变量b的shape,结果为:

    (3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1)

    不知道哪儿多出来这么多维度。 bug已经复现,开始debug。为了验证是否是数据类型转换问题,修改代码第二行如下:

    a = nd.array([[1,2,3], [2,3,4]]) b = np.var(a.asnumpy()) c = nd.array(b + 1)

    哦哟,正常了!问题到这里已经解决了。 结论:用numpy方法对nd.array数据操作时,需要先用asnumpy()方法将数据转换成np.array类型。 额外注意:不能用np.array(…)来转换数据类型,也会导致后续出错!

    Processed: 0.010, SQL: 9