记录使用random-shuffle函数遇到的一个坑

最近在做tensorflow相关项目时,遇到一个问题是这样的:

训练程序运行后损失函数loss开始在不断减小,没过多久却越来越大,最后固定值不变。

还以为产生了震荡,但最后loss一直保持不变让人疑惑,或者是模型哪块出了问题还是优化函数出了问题,调试了很久还是很不正常,于是摆出了不找到原因不罢休的气势来,调试了两天终于发现,原来是random.shuffle函数捣的鬼。想到tensorflow中tensor处理数据是numpy.array类型,在批量训练时候,将array类型数据传给feed_dict参数。在传给feed_dict之前,对数据顺序有个随机打乱操作,用到了random.shuffle函数。问题就处在这:random.shuffle对numpy.array类型多维矩阵数据进行操作时会出现不能理解的结果。

random.shuffle函数:用于list类型没问题,用于array类型会出现问题,举例说明:

import random
import numpy as np
a = []
for i in range(10):
    a.append([i]*5)

b = a[:]
b = np.array(b)
print('a',a)
print('b',b)

random.shuffle(a)
random.shuffle(b)
print('shuffle a:',a)
print('shuffle b:',b)

输出结果:
a: [[0, 0, 0, 0, 0], [1, 1, 1, 1, 1], [2, 2, 2, 2, 2], [3, 3, 3, 3, 3], [4, 4, 4, 4, 4], [5, 5, 5, 5, 5], [6, 6, 6, 6, 6], [7, 7, 7, 7, 7], [8, 8, 8, 8, 8], [9, 9, 9, 9, 9]]
b: [[0 0 0 0 0]
 [1 1 1 1 1]
 [2 2 2 2 2]
 [3 3 3 3 3]
 [4 4 4 4 4]
 [5 5 5 5 5]
 [6 6 6 6 6]
 [7 7 7 7 7]
 [8 8 8 8 8]
 [9 9 9 9 9]]
shuffle a: [[1, 1, 1, 1, 1], [0, 0, 0, 0, 0], [2, 2, 2, 2, 2], [3, 3, 3, 3, 3], [9, 9, 9, 9, 9], [8, 8, 8, 8, 8], [4, 4, 4, 4, 4], [5, 5, 5, 5, 5], [7, 7, 7, 7, 7], [6, 6, 6, 6, 6]]
shuffle b: [[0 0 0 0 0]
 [0 0 0 0 0]
 [0 0 0 0 0]
 [3 3 3 3 3]
 [1 1 1 1 1]
 [3 3 3 3 3]
 [6 6 6 6 6]
 [0 0 0 0 0]
 [6 6 6 6 6]
 [6 6 6 6 6]]

可以看出,对array进行shuffle操作并没有按行顺序打乱,而是出现多个重复的行(感觉很奇怪,具体逻辑没研究,但对一维array数据是可行的。) 其实,array数据有专门打乱顺序的函数:numpy.random.shuffle(arr)

import random
import numpy as np
a = []
for i in range(10):
    a.append([i]*5)
print('a:',a)
b = a[:]
b = np.array(b)
print('b:',b)

random.shuffle(a)
np.random.shuffle(b)
print('shuffle a:',a)
print('shuffle b:',b)

输出结果:
a: [[0, 0, 0, 0, 0], [1, 1, 1, 1, 1], [2, 2, 2, 2, 2], [3, 3, 3, 3, 3], [4, 4, 4, 4, 4], [5, 5, 5, 5, 5], [6, 6, 6, 6, 6], [7, 7, 7, 7, 7], [8, 8, 8, 8, 8], [9, 9, 9, 9, 9]]
b: [[0 0 0 0 0]
 [1 1 1 1 1]
 [2 2 2 2 2]
 [3 3 3 3 3]
 [4 4 4 4 4]
 [5 5 5 5 5]
 [6 6 6 6 6]
 [7 7 7 7 7]
 [8 8 8 8 8]
 [9 9 9 9 9]]
shuffle a: [[6, 6, 6, 6, 6], [8, 8, 8, 8, 8], [0, 0, 0, 0, 0], [2, 2, 2, 2, 2], [4, 4, 4, 4, 4], [7, 7, 7, 7, 7], [1, 1, 1, 1, 1], [9, 9, 9, 9, 9], [3, 3, 3, 3, 3], [5, 5, 5, 5, 5]]
shuffle b: [[2 2 2 2 2]
 [4 4 4 4 4]
 [6 6 6 6 6]
 [1 1 1 1 1]
 [0 0 0 0 0]
 [7 7 7 7 7]
 [9 9 9 9 9]
 [5 5 5 5 5]
 [3 3 3 3 3]
 [8 8 8 8 8]]

记录一下。同时,特别提醒大家不要和我一样犯同样错误。

转载于:https://my.oschina.net/u/3851199/blog/1944828

  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值