性别识别中遇到的坑
- 训练数据集中的数据没有经过一定的人工确认,其中出现了明显的打标错误问题(原始图像有一定的重名),导致训练果真精度始终比较低。后期经过手动的分析,找到问题解决
- 始终以为自己的代码写的有问题,没有效果。实际是调试时使用笔记本跑训练,本身运行比较慢,需要较长时间才能看到算法的效果,大概10个epoch以上,而笔记本跑一个epoch需要半个小时,导致错误的以为程序出错。解决办法:1. 找个跑的块的机器,2. 使用很少的数据进行训练,比如只用固定的32张图片进行训练,这样可以让你快速确认代码问题,比如损失是否有下降之类的。
- 数据没有预处理,原始数据格式为jpg,每次训练时才进行解压,这个实际上是非常没有效率的,因为解压jpg只能在cpu上进行,GPU在大多数状态都处于等待状态。最好是采用numpy数组,或者是其他非压缩的格式保存。
- 227*227*3的图片,采用uint8的格式进行保存,10000张的图片大概在2G左右。如果训练数据较少,可以一次性导入内存中进行训练,如果数据量比较大,那么需要使用tfRcord进行处理。
- 刚开始训练时网络要足够简单,其他的优化方法可以在后期逐步的加入。
- dropout的效果比l2正则化更好,两者具体的关系还需要进一步的进行验证,比如同时使用,单独使用,各自的权重系数,还有dropout应该加到网络的那些层上等。
- 在当前例子中,使用灰度图可以达到和彩色图几乎一样的精度。
- dropout的比例从0.5调整到0.4之后,整体效果变差,验证集的精度下降到了不足90%
- 使用numpy的mean函数时,如果直接指定dtype为uint8时,会发生截断的错误,方法是在计算完成后再做类型转换
- 将所有的数据集生成一个较大的tfrecord时,也会导致训练时速度变慢。
- 性别分类的时最好是新增一类无法分辨性别的类别,而不是仅分为两类
- 使用train2014数据时出现了灰度图像的jpg,到时生成的trrecords文件格式无法统一
- 使用match_filenames_once时需要初始化local_variables, 并且start_queue_runner要放到初始化变量之后。