发现问题
在跑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(…)来转换数据类型,也会导致后续出错!