第一次写博客,可能写的比较乱,请不要在意。
做个介绍,本程序是我的毕业设计内容,主要任务是使用神经网络识别出一行字符,包括汉字、字母和标点符号,印刷体和手写的字符都可以识别,测试结果在下面。我的训练显卡是GTX TITAN Xp (12GB)
我的训练程序架构由预处理函数 + 四层卷积神经网络(CNN) + 二层双向长短期记忆网络(BLSTM) + 一层全连接层 + CTC函数组成,编程语言为python3,使用的神经网络封装底层是keras,训练集是网上某位大佬整理分享的(十分感谢),源地址找不到了,我把我的百度网盘来分享,地址 /s/1SlvkqJMU6BhMIb8nhCNmnA,密码 p9lu(训练集内每张图片都包含一行印刷体字符)。
现在来简单说说我的思路,首先,我对训练集进行大量预处理以提高最终的识别正确率,比如将图片按比例伸缩,转为灰度值等,如果有需要还可以用数据增强,其次,用CNN进行特征提取,接着,将提取的特征送入长短期记忆网络中处理,然后,将处理后的值展平送入keras的ctc函数中,最后,用ctc解码,将得到的值对照“字典”翻译即可。为了降低过拟合,我使用了dropout和recurrent_dropout。
“字典”地址 /s/1wC72Q0MMVYcv1YMxkJk4tw,密码 ng9e。这是一个txt文件,里面是所有待预测的字符,每个字符各占一行,预处理时让程序读入该txt成为字典,最后将解码时得到的值依照字典翻译即可得到正确的结果。
我之所以使用LSTM是因为它相比于普通的循环神经网络(RNN),增加了一种携带信息跨越多个时间步的方法,能有效地解决梯度消失问题。使用双向处理是因为RNN(LSTM是RNN的一种)特别依赖顺序或时间,倘若打乱时间步的或反转时间步则会完全改变RNN从序列中提取的表示,因此,双向RNN能够捕捉到可能被单向RNN忽略的模式。最后关于CTC算法的介绍我这就不多赘述,网上很多大神都有详解,搜他们的文章来学习就好了(https://www.jianshu.com/p/0cca89f64987 这篇在简书上的文章讲的很清晰)。
由于毕业设计应该还在审核的原因,代码就先不放了,下面是部分例子,正确率差强人意。
我的邮箱:[email protected]
欢迎交流