尝试对Lenet网络进行K-fold验证
在网络上找到的tensorflow并没有集成对神经网络进行k-fold cross validation的函数,思考原因,找到了以下回答:
如果用了dropout,相当于用了cross
validation,因为每个训练数据在每个epoch只能见到一个随机的子网络。最后测试时是这k个子网络的平均,k接近无限。
还有如果随机的组成mini batch,每个batch又是训练数据的随机子集,也相当于把训练数据分为无限个子集,降低了过拟合风险。
我理解是以上两点引入足够的随机性,能让结果稳定。如果还有过拟合,还可以加其他方法,比如对参数加L1/L2norm限制,data
augmentation,unet/auto encoder等稀疏结构。
来自:http://sofasofa.io/forum_main_post.php?postid=1003228
dropout在每一次传输之后都会自动的切断某个两个神经元之间的连线,这与继承学习的道理类似,目的就是为了构造不同的网络结构,增强网络的稳定性。
神经网络的训练费时间,所以一般都只将集合分为train、validation、test三个部分即可,至于防止过拟合的方法,上面也有提到,采用dropout、mini batch这一些措施即可
上周在训练模型的时候validation的准确率达到了99%,这显然是过拟合了。我回去查看代码,发现其实验证集和训练集有重叠。于是我重新划分了数据集,再次训练,得到一个比较合理的模型,前后对比如图:
倾斜校正问题
有些人写字写一行都能写歪,确实是一个脑残的问题。
所以只能靠算法补上。但算法也不是万能的。
倾斜矫正有两个办法:
- 通过大量的数据集去学习复杂文本的位置
但这种很大程度上识别区域不全,所以会使得后面识别字体的时候准确度下降,或者漏识别。 - 利用霍夫变换进行直线检测。
这种方法对于检测出来的直线难以筛选,经过测试有时候甚至认为筛选也无法去掉某些长度一致但不需要的直线…因此无法调整合适的图像旋转角度。
下面是霍夫变换检测直线的例子,就单行来讲,检测起来只要是参数人工调整,还是比较理想的:
最后决定采用:
利用霍夫变换进行直线检测
但是,其中霍夫变换这个函数对于检测出来的直线数量变化很大,受图像信息影响比较厉害,所以在设置的时候需要人为地去更改参数。并写好参数说明。