LBP-DBN-face-recognition
使用LBP特征提取算法提取人脸特征,DBN网络来实现人脸识别,测试数据库-ORL数据库,识别率可达90%以上
###工程使用方法:
clone下工程,要根据实际情况修改test_example_DBN.m中的文件路径
我们在该文件中,a=imread(strcat('E:\My RBM-DBN matlab\ORL\ORL\s',num2str(i),'_',num2str(j),'.bmp'));
###工程说明:
####英文简称注释:
DBN-深度信念网络、RBM-受限的玻尔兹曼机 、LBP-局部二值模式
####几点说明:
0-这个程序的功能,使用DBN算法来实现人脸识别,数据库使用ORL数据库,在迭代次数达到3000时,识别准确率98%左右
2-此程序还附带了画学习曲线的功能,画正则参数,隐层结点数,训练样本数的学习曲线
3-DBN是有几层RBM构成,我这个程序实现的是4层网络,输入层-隐层1-隐层2-输出层
4-DBN的训练基本上分为两步,先用RBM的训练方法训练网络得到初始值,来初始化整个网络,然后用BP反向传播算法来微调整个网络
5-神经网络参数的更新,使用matlab提供的fmincg函数,前提是我们要先得到网络的代价函数nnCostFunction
####各文件的功能说明:
test_example_DBN:主函数
dbnsetup:初始化DBN网络
dbntrain:训练DBN网络,DBN是由多层RBM组成,训练方法是逐层训练,先训练第一层网络,然后固定第一层网络的参数,将第一层网络的输出作为下一层网络的输入
dbnunfoldtonn:DBN训练得到的参数来初始化神经网络
fmincg:最优化函数,只要我们得到网络的代价函数,和反向传播算法,就可以用此函数求最优解
getmapping,lbp,lbptest:完成lbp算法
hidden_node_learn_curve:关于隐层结点的学习曲线
learningCurve:关于训练样本数目的学习曲线
nnCostFunction:求神经网络的代价函数,和BP反向传播算法
predict:利用网络进行预测
randInitializeWeights:随机初始化网络参数
rbmdown,rbmup,sigm,sigmoid,sigmoidGradient,sigmrnd:训练过程中使用到的计算函数
train_nn:训练神经网络
rbmtrain:训练一个RBM网络
validationCurve:关于正则参数的学习曲线
整个框架就是:
先用LBP算子对人脸图像进行特征提取,然后用RBM算法逐层训练RBM,训练得到的RBM参数来初始化化DBN网络,然后计算出整个网络的代价函数,并使用BP反向传播算法,谨记反向传播算法也是梯度下降算法,并且可以用梯度校验来验证。梯度下降算法,学习率是一个比较关键的参数,但是,在我的程序中,自己不设学习率,只要我们实现了反向传播算法和代价函数,我们使用fmincg函数去得到最优解。
###优点:
神经网络采用的是随机初始化,但容易收敛到局部最小值,用DBN训练得到网络的初始化参数,而不是随机初始化。DBN随机初始化之后,网络的训练方式就跟训练神经网络一样。
###想弄明白这个程序:需要了解LBP,RBM,DBN,BP神经网络的知识
现在,把我实现这个工程,用到的各种资源贴上来,方便学习
我的工程是在别人的代码上改进的,代码见此博客
http://blog.csdn.net/dark_scope/article/details/9447967
####BP神经网络:
神经网络-UFLDL
####视频资源,强烈推荐看一下couresa上吴恩达的视频machine learing ,可以看一下这几节课
1、IX: Neural Networks: Learning (Week 5)
介绍反向传播算法,梯度校验(梯度校验可以检查我们的梯度下降法是否正确,也可以校验我们的反向传播算法是否正确)
2、VII:正则化,我的程序中使用了正则参数
3、X:Advice for Applying Machine Learning (Week 6):讲述过拟合,欠拟合之类的,并教授描绘学习曲线的方法。