记录使用random-shuffle函数遇到的一个坑
2018-09-05 20:11
375 查看
最近在做tensorflow相关项目时,遇到一个问题是这样的:
训练程序运行后损失函数loss开始在不断减小,没过多久却越来越大,最后固定值不变。
还以为产生了震荡,但最后loss一直保持不变让人疑惑,或者是模型哪块出了问题还是优化函数出了问题,调试了很久还是很不正常,于是摆出了不找到原因不罢休的气势来,调试了两天终于发现,原来是random.shuffle函数捣的鬼。想到tensorflow中tensor处理数据是numpy.array类型,在批量训练时候,将array类型数据传给feed_dict参数。在传给feed_dict之前,对数据顺序有个随机打乱操作,用到了random.shuffle函数。问题就处在这:random.shuffle对numpy.array类型多维矩阵数据进行操作时会出现不能理解的结果。
random.shuffle函数:用于list类型没问题,用于array类型会出现问题,举例说明:
可以看出,对array进行shuffle操作并没有按行顺序打乱,而是出现多个重复的行(感觉很奇怪,具体逻辑没研究,但对一维array数据是可行的。)
其实,array数据有专门打乱顺序的函数:numpy.random.shuffle(arr)
记录一下。同时,特别提醒大家不要和我一样犯同样错误。
训练程序运行后损失函数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]]
记录一下。同时,特别提醒大家不要和我一样犯同样错误。
相关文章推荐
- 使用c函数库的两个函数strtok, strncpy遇到的问题记录
- 记录在eclipse中使用ant遇到到的一个小问题
- 函数返回值为指针的一个陷阱(使用inet_ntoa函数时遇到的问题)
- 经常遇到的一个问题是 MFC中开启多线程后 在非主线程中使用updata函数出现崩溃的情况。
- oracle数据库使用wm_concat()函数时遇到的一个问题
- Win7中如何在服务中启动一个当前用户的进程——函数CreateProcessAsUser()的一次使用记录
- 序列化二叉树的一种方法是使用预序遍历。当我们遇到一个非空节点时,我们记录节点的值 如果它是一个空节点,我们使用一个哨兵值如#记录。
- 记录一个使用Hibernate Validator验证信息参数化遇到的问题
- 使用cocoapods遇到的一个问题,记录
- 设计程序,单击【随机数】按钮,使用Math对象的random函数产生一个0-100之间(含0-100)的随机整数,并在对话框中显示,如下图。单击【计算】按钮,计算该随机数的平方、平方根和自然对数,保留两位小数,并在对话框中显示,如下图。
- thinkphp 使用过程中遇到的一个小函数
- php关于使用iconv(...)函数对字符进行中文转换时,遇到的一个问题
- 使用AlertDialog时遇到的一个小错误,简单记录下
- 使用cocoapods遇到的一个问题,记录
- 使用css expression遇到的一个问题
- 使用Access,遇到“所有记录中均未找到搜索关键字”
- 在vb中使用Iphlpapi.dll获取网络信息 第四章 第二节 一个重要函数
- 使用dom4j解析xml文件时遇到一个怪问题
- 使用'VRM_SET_VALUES'函数在selection屏幕上建一个Combobox控件示例
- 使用Action创建一个JButton后,改变该按钮的名字可能会遇到意想不到的问题