下面会是一个较典型的 CNN(卷积神经网络)的工程应用场景 “4 位验证码的识别”。不谈理论,有用为王。(主要是理论一时半会儿讲不清也讲不透~)

基于 CNN 的 4 位验证码识别

1.效果

识别准确率 86.1%,字符集长度总计 62,为英文字符(区分大小写)+ 数字。

从效果上比不上动不动几个 9 的业界案例,第一次还是不错的。当然与老 J 关系不大,主要还是模型牛。再者用 CPU 跑模型得用天计的时间真的耗不起。

2.过程

生成图片

通过 captcha 库自动生成图片。分别生成训练集、验证集、测试集图片,比例为 50,000 : 5,000 : 5,000。其中,训练集用于训练模型,验证集用于评估训练效果,测试集用于检验模型泛化能力。

图片预处理

主要是做图片灰度化处理,彩色验证码图片作为训练输入无意义。

上述完成了前置的准备工作,正式切入正题。从代码量来看,准备数据占到 8 成以上,使用 Tensorflow 的模型本身代码量极低,佩服 佩服!

训练

模型为 4 层卷积 + 池化 + 1 层输出层。采用激活函数 softmax,适用于多分类问题。

考虑到效率以及防止过拟合,训练样本数 20000 ,耗时 7 h,loss 为 0.2 左右时停止训练(过于耗时)。

loss 目标值在 0.1 较为理想,预期识别准确率能稳定在 90% 以上,也就是 loss 值越低越接近真实,但也要防止过度拟合。

验证

经过训练 20k 后,对模型进行评估。

测试

最终,如第一张效果图,训练识别正确率为 86.1%。

# 小结

1、CNN 作为深度学习热门的神经网络,有着参数少、训练快、得分高、易迁移的特点,得到广泛的应用。该门领域概念较多,上述应用中,权重、偏置量、学习率、Dropout 等配置均采用典型设置。

2、采用 CPU 进行模型训练效率偏低,一个 step 平均在 1.5s 左右。有条件的可以采用 GPU 并行处理。验证、测试环节速度较快,基本秒回结果。

3、本次应用采用的深度学习框架为 Tensorflow,其它常见的框架还有 keras、Torch、caffe、theano、lasagne。

4、激活函数采用 softmax 处理多分类问题。常见的还有 sigmoid 处理二分类问题,在隐藏层使用的 ReLU、LeakyReLU 以及 Tanh。

最后,CNN 本质是基于特征提取,加上卷积运算的神经网络。概念容易理解,理论推倒繁杂,尤其涉及到向量计算。再者,参数的调配(fine tune)需要大量的实践,样本数量与训练效率的平衡也无定式可言。总之,要花时间慢慢摸索,在此老 J 也就是抛砖引玉,希望能对大伙儿有所启发。源码见👉原文地址


↙↙↙阅读原文可查看相关链接,并与作者交流