【血泪bug】说好的以同样顺序打乱数据与标签呢?np.random≠random

BUG背景

我试图执行一项深度学习文本分类任务,结果炼丹怎么炼正确率都超不过瞎蒙。后来才发现是打乱样本顺序时出的问题。

错误代码

我原本需要把数据矩阵和标签以同样的顺序打乱。如:
sample_vector=[[1,2,3],[4,5,6],[7,8,9]]
sample_labels=[1,2,3]
→随机打乱成:
sample_vector=[[4,5,6],[7,8,9],[1,2,3]]
sample_labels=[2,3,1]
我的程序如下:

state=np.random.get_state() #记录下随机器此时的伪随机状态
random.shuffle(sample_vector) #随机打乱新闻数据
random.set_state(state) #恢复到同样的伪随机状态
random.shuffle(sample_labels) #将标签以同样的顺序打乱

然而在(反复炼丹失败后才想起来)测试的时候,我发现这段代码并不能实现我希望的效果,两个数组的打乱顺序完全不一样。这是为什么呢?

正确代码

这个bug简单得令人发指,这是因为np.random和random是两个不同的随机器……上述代码中state记录的是随机器np.random的状态,但shuffle数据的时候用的却是random这个随机器,随机出来的结果当然和np.random的状态风马牛不相及了。正确代码如下:

state=np.random.get_state() #记录下此时的伪随机状态
np.random.shuffle(sample_vector) #随机打乱新闻数据
np.random.set_state(state) #恢复到同样的伪随机状态
np.random.shuffle(sample_labels) #将标签以同样的顺序打乱

统一使用np.random或者是random就好了。

感想

这个简单的bug真是太血泪了,苦了帮我炼丹炼得头昏脑热高温发烫的笔记本君了……

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值