mxnet: setting an array element with a sequence

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值