目录
- 一、问题描述
- 二、算法步骤
- 2.1 读入数据并提取特征
- 2.2 创建神经网络并训练
- 2.3 测试
- 三、结果分析
一、问题描述
BP神经网络利用输出后的误差来估计输出层的直接前导层的误差,再用这个误差估计更前一层的误差,如此一层一层的反传下去,就获得了所有其他各层的误差估计。
BP算法采用的是多层感知器的误差反向传播算法,其基本思想是,学习过程由信号的正向传播与误差的反向传播两个过程组成。
正向传播时,输入样本从输入层传入,经各隐层逐层处理后,传向输出层。若输出层的实际输出与期望的输出不符,则转入误差的反向传输阶段。
误差反传是将输出误差以某种形式通过隐层向输入曾逐层反传,并将误差分摊给各层的所有单元,从而获得各层单元的误差信号,该误差信号即作为修正各单元权值的依据。
BP神经网络的基本流程图如下:
本文的目标是对于人脸数据库图像,利用BP神经网络进行人脸方向预测,合理的定位人脸方向。
二、算法步骤
2.1 读入数据并提取特征
代码如下:
for j=1:N_train
for i=1:M_train
%读取图像,连接字符串形成图像的文件名。
str=strcat('Images\',num2str(i),'_',num2str(j),'.bmp');
img= imread(str);
[rows cols]= size(img);%获得图像的行和列值。
img_edge=edge(img,'Sobel');
%由于在分割图片中,人脸的眼睛部分位置变化比较大,边缘检测效果好
sub_rows=floor(rows/6);%最接近的最小整数,分成6行
sub_cols=floor(cols/8);%最接近的最小整数,分成8列
sample_num=M_train*N_train;%前5个是第一幅人脸的5个角度
sample_number=sample_number+1;
for subblock_i=1:8 %因为这还在i,j的循环中,所以不可以用i
block_num=subblock_i;
pixel_value(sample_number,block_num)=0;
for ii=sub_rows:(2*sub_rows)
for jj=(subblock_i-1)*sub_cols+1:subblock_i*sub_cols
pixel_value(sample_number,block_num)=pixel_value(sample_number,block_num)+img_edge(ii,jj);
end
end
end
end
end
2.2 创建神经网络并训练
代码如下:
% 创建一个新的前向神经网络
net_1=newff(minmax(P),[10,3],{'tansig','purelin'},'traingdm')
% 调用 TRAINGDM 算法训练 BP 网络
[net_1,tr]=train(net_1,P,T);
2.3 测试
代码如下:
% 对 BP 网络进行仿真
A = sim(net_1,P);
% 计算仿真误差
E = T - A;
MSE=mse(E)
x=[0.14 0 1 1 0 1 1 1.2]';
sim(net_1,x)
三、结果分析
运行结果如下:
均方根误差:
从结果可看出,运用BP神经网络进行人脸方向预测,预测误差很小,均方根误差为0.00099931,预测的结果逼近于真实结果,因此,BP神经网络具有较好的数据预测和拟合能力,应用较广泛。BP神经网络具有以下优点:
(1)非线性映射能力:BP神经网络实质上实现了一个从输入到输出的映射功能,数学理论证明三层的神经网络就能够以任意精度逼近任何非线性连续函数。这使得其特别适合于求解内部机制复杂的问题,即BP神经网络具有较强的非线性映射能力。
(2)自学习和自适应能力:BP神经网络在训练时,能够通过学习自动提取输出、输出数据间的“合理规则”,并自适应的将学习内容记忆于网络的权值中。即BP神经网络具有高度自学习和自适应的能力。
(3)泛化能力:所谓泛化能力是指在设计模式分类器时,即要考虑网络在保证对所需分类对象进行正确分类,还要关心网络在经过训练后,能否对未见过的模式或有噪声污染的模式,进行正确的分类。也即BP神经网络具有将学习成果应用于新知识的能力。
(4)容错能力:BP神经网络在其局部的或者部分的神经元受到破坏后对全局的训练结果不会造成很大的影响,也就是说即使系统在受到局部损伤时还是可以正常工作的。即BP神经网络具有一定的容错能力。
由于文章限制,完整人脸朝向数据集和BP神经网络代码可以在这里下载:https://download.csdn.net/download/didi_ya/87741778。