美文网首页
记录使用random.shuffle函数遇到的一个坑

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

作者: zoulala | 来源:发表于2018-07-23 17:03 被阅读0次

    最近在做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]]
    

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

    相关文章

      网友评论

          本文标题:记录使用random.shuffle函数遇到的一个坑

          本文链接:https://www.haomeiwen.com/subject/jgejmftx.html