2019独角兽企业重金招聘Python工程师标准>>>
最近在做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]]
记录一下。同时,特别提醒大家不要和我一样犯同样错误。