前言
前段时间,项目中的一个小模块中用到了手写数字识别,走过弯路趟过坑,这里分享出来。
实战
-
手写数字分类模型v1.0
1、使用ResNet网络搭建模型
2、github开源代码:https://github.com/Curt-Park/handwritten_digit_recognition
3、模型训练准确率:99.6%
4、训练准确率如此之高,以为万事大吉。在随后的项目实际使用中,13位的数字的整体识别率低于80%,单个数字的识别率低于99%
5、原因分析
1)训练数据4万+,对应0-9共10个数字应该不是问题
2)分析了下识别率差的数字基本都是写的不太规范的,但人看是容易分清楚的。故初步分析是模型泛化能力达不到要求。
3)分析现有的CNN网络,发现DenseNet比ResNet在很多数据集上面效果都有很很多,故模型改为DenseNet搭建。
-
手写数字分类模型v2.0
1、详细介绍:DenseNet—Dense卷积网络
2、使用DenseNet搭建网络
3、模型训练准确率:99.83% (比ResNet有提升)
4、对上面相同的数据进行测试,整体准确率96%以上,单个数字识别率99.8%以上,基本满足了项目要求。
-
DenseNet网络优点
1.强梯度流
误差信号可以更直接地传播到早期的层中。这是一种隐含的深度监督,因为早期的层可以从最终的分类层直接获得监督。
2.参数和计算效率
对于每个层,RetNet 中的参数与c×c成正比,而 DenseNet 中的参数与1×k×k成正比。
由于 k<<C, 所以 DenseNet 比 ResNet 的size更小。
3.更加多样化的特征
由于 DenseNet 中的每一层都接收前面的所有层作为输入,因此特征更加多样化,并且倾向于有更丰富的模式。
4.保持低复杂度特征
在标准ConvNet中,分类器使用最复杂的特征。
在 DenseNet 中,分类器使用所有复杂级别的特征。它倾向于给出更平滑的决策边界。它还解释了为什么 DenseNet 在训练数据不足时表现良好。