matlab 中文论坛教程之BP网络。
首先说觉得老师讲的确实很好,很清楚。
下面记一下我的听课笔记。
BP:backpropagation was created by generalizing the Widrow-Hoff learning rule to multiple-layer networks and non-linear differential transfer function.
多层的话可以将原来不可分的变成可分的。下面这张幻灯片上的理论就是Widrow-Hoff learning rule。这个理论的过程的核心就是减小误差,它是一个从后向前更新权重的过程(back)根据后面的输出依次向前找出权重,由这个rule,得出上面这张幻灯片里的IW和LW。
%从图中可以看出每一组的输入数据有8个,隐藏层有10个神经元,输出层有3个。function mytest()
clc;
images=[ ];
M_train=3;%表示人脸
N_train=5;%表示方向
sample=[];
pixel_value=[];
sample_number=0;
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
%将特征值转换为小于1的值
max_pixel_value=max(pixel_value);
max_pixel_value_1=max(max_pixel_value);
for i=1:3
mid_value=10^i;
if(((max_pixel_value_1/mid_value)>1)&&((max_pixel_value_1/mid_value)<10))
multiple_num=1/mid_value;
pixel_value=pixel_value*multiple_num;
break;
end
end
% T 为目标矢量
t=zeros(3,sample_number);
%因为有五类,所以至少用3个数表示,5介于2的2次方和2的3次方之间
for i=1:sample_number
% if((mod(i,5)==1)||(mod(i,5)==4)||(mod(i,5)==0))
if(i<=3)||((i>9)&&(i<=12))||((i>12)&&(i<=15))
t(1,i)=1;
end
%if((mod(i,5)==2)||(mod(i,5)==4))
if((i>3)&&(i<=6))||((i>9)&&(i<=12))
t(2,i)=1;
end
%if((mod(i,5)==3)||(mod(i,5)==0))
if((i>6)&&(i<=9))||((i>12)&&(i<=15))
t(3,i)=1;
end
end
% NEWFF——生成一个新的前向神经网络
% TRAIN——对 BP 神经网络进行训练
% SIM——对 BP 神经网络进行仿真
% 定义训练样本
% P 为输入矢量
P=pixel_value'
% T 为目标矢量
T=t
size(P)
size(T)
% size(P)
% size(T)
% 创建一个新的前向神经网络
net_1=newff(minmax(P),[10,3],{'tansig','purelin'},'traingdm')%minmax(P)是找到P的最大值和最小值,作为newff的输入范围。[10,3]中10表示隐藏层里有10个神经元,3表示输出层,在matlab里输入层是不算的。
%从图中可以看出每一组的输入数据有8个,隐藏层有10个神经元,输出层有3个。
%{'tansig','purelin'}代表隐藏层和输出层的决策函数
%查看网络参数
% 当前输入层权值和阈值
inputWeights=net_1.IW{1,1}
inputbias=net_1.b{1}
% 当前网络层权值和阈值
layerWeights=net_1.LW{2,1}
layerbias=net_1.b{2}
% 设置训练参数
net_1.trainParam.show = 50;
net_1.trainParam.lr = 0.05;
net_1.trainParam.mc = 0.9;
net_1.trainParam.epochs = 10000; %每训练1000次后给出一次结果
net_1.trainParam.goal = 1e-3; %设置网络计算出的结果与实际数据的误差小于0.001
% 调用 TRAINGDM 算法训练 BP 网络
[net_1,tr]=train(net_1,P,T);
% 对 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)
web -browser http://www.ilovematlab.cn/thread-18635-1-1.htmlmatlab命令窗口输出:
0.8760 0.2398 0.7230 -0.3786 -0.3939 -0.2916 0.2027 0.5061
-0.3426 0.2428 -0.7280 -0.0987 -0.0049 0.7508 -0.3601 0.1878
-1.2945 0.3135 -0.6070 -0.5300 0.1616 0.1685 0.0865 0.0832
0.5795 -0.2162 -0.3885 0.1845 -0.3926 0.1743 0.4385 1.1605
0.7350 0.0902 0.6849 -0.5076 0.3061 -0.3670 -0.0875 0.8137
0.9330 -0.3852 -0.1570 0.0690 0.3884 -0.4169 0.4037 0.5951
-0.9643 -0.4881 -0.3582 0.3003 0.3141 -0.2739 -0.3727 -0.4125
-0.1345 0.6588 -0.6841 -0.3413 0.0068 0.4994 -0.2025 -0.1347
0.2900 -0.3836 -0.2626 -0.0870 -0.3240 0.7434 0.0168 0.9228
0.5420 0.1398 -0.2640 0.0959 0.2984 0.2981 -0.5329 -1.1787
inputbias =
-2.7755
1.7289
2.4978
-2.0329
-1.4530
-1.3784
1.9494
-0.9278
0.9267
2.2788
layerWeights =
-0.7805 0.9453 -0.4171 0.2786 0.6765 -0.8779 0.6555 -0.2132 -0.5848 0.3429
-0.4602 0.4208 0.7007 -0.4893 0.1694 0.1693 -0.6180 0.6531 -0.3638 0.1420
0.0493 -0.3763 0.8233 -0.8227 0.8962 -0.4298 -0.1149 0.3537 -0.7324 -0.6605
layerbias =
-0.7047
-0.0478
0.8162
MSE =
9.9959e-04
ans =
1.0793
-0.2251
0.5312
本文通过使用MATLAB实现BP神经网络训练,详细介绍了如何通过图像处理获取特征,并应用于人脸识别的角度分类任务。文中提供了完整的代码示例及网络参数调整说明。
5953

被折叠的 条评论
为什么被折叠?



