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真是太血泪了,苦了帮我炼丹炼得头昏脑热高温发烫的笔记本君了……