一、理论基础
对数字识别的方法有很多,本文从人工神经网络的角度出发,介绍一种数字识别的方法。人工神经网络中的Hopfield网是一种回馈型网络,其通过网络神经元状态的变迁而最终稳定于平衡状态,并且这种网络具有联想记忆(Autoassociative Memory)能力,能够从某一残缺的信息回忆起所属的完整的记忆信息,这为数字识别奠定了理论基础。
在数字识别中,将规范的阿拉伯数字(0到9)视为网络中的各个神经元,当其到达稳定状态后,对于一个不规范的数字的输入,网络可以根据输入进行联想记忆,记忆的结果即可视为识别的结果。
具体的操作步骤可以如下:利用Hebbian理论进行网络学习,可得到一个网络权值矩阵w,最后,将输入s与w进行联想记忆操作。
二、具体实现
本文在MFC中实现了对数字"0","1","2"的识别,程序运行结果如下图所示:(文章的末尾提供了源代码下载)

所有的样本和输入输出,都是在一个6*5的网格内进行的,如果一个Cell被填充了黑色,则该Cell的值为-1,返之为1,因此,可以将一个阿拉伯数字的信息数字化为一个1*30的矩阵。界面上方的网格显示了"0","1","2"这三个样本的表示,左下方的网格接收输入(通过鼠标点击或滑动来填充颜色),点击"Recognize"按钮后,识别的结果在右下方的网格内显示。点击"Clear"按钮,则清除输入与输出,准备下一次识别。在上图中,虽然输入了一个不完整、且含有若干噪声点的数字"2",但最后还是输出了一个完整的数字"2"。
程序的关键部分是网格的绘制和矩阵运算。网格对象包括了起始坐标、行高、列宽、行数、列数等属性,以及绘制、填充、数字化等操作,将这些封装到一个类里,有效的提高了程序的可读性和可扩展性。如:为了提高精度,需要将数字显示在一个60*50的网格内时,只须修改相关参数即可。本例中数字的表示是一个1*30的矩阵,w是一个30*30的矩阵,而计算w时需要用到矩阵的乘法、加法、转置操作,下面是矩阵运算的C++关键代码:
//矩阵的乘法运算
int** Matrix::Multiply(int **a, int **b, int ra, int ca, int rb, int cb)
{
if(ca != rb)
{
return NULL;
}
int **result = new int*[ra];
int i, j, k, sum;
for(i = 0;i < ra;i++)
{
result[i] = new int[cb];
for(j = 0;j < cb;j++)
{
sum = a[i][0] * b[0][j];
for(k = 1;k < ca;k++)
{
sum += a[i][k] * b[k][j];
}
result[i][j] = sum;
}
}
return result;
}
//矩阵的加法运算
int** Matrix::Addition(int **a, int **b, int ra, int ca, int rb, int cb)
{
if(ra != rb || ca != cb)
{
return NULL;
}
int **result = new int*[ra];
int i, j;
for(i = 0;i < ra;i++)
{
result[i] = new int[ca];
for(j = 0;j < cb;j++)
{
result[i][j] = a[i][j] + b[i][j];
}
}
return result;
}
//矩阵的转置运算
int** Matrix::Transpose(int **a, int ra, int ca)
{
int tmp, i, j;
tmp = ra;
ra = ca;
ca = tmp;
int** result = new int*[ra];
for(i = 0;i < ra;i++)
{
result[i] = new int[ca];
for(j = 0;j < ca;j++)
{
result[i][j] = a[j][i];
}
}
return result;
}
本程序可以扩展成样本由用户输入的模式,这样会使程序更加灵活。本程序也只是一个数字识别的最简单实现,存在很多识别不准确的情况,可以利用更多的理论知识对算法进行改进,提高识别的准确度。当然,Autoassociative Memory还可以用在数识别以外的很多领域,如:考古中对模糊文字的识别、车牌字母和数字的识别,本文只是起到一个抛砖引玉的作用,介绍的深度和广度都还不够。
Resources & Reference:
1、Autoassociative Memory.pdf
2、Supervised Hebbian Learning.pdf
3、何建华-神经网络讲义-part5-Hopfield网络.ppt
4、数字识别MFC源代码下载



