神经网络
六个问题
- 什么时候可以用神经网络
- 分类还是回归
- Deterministic 还是Stochastic
- Supervised 还是Unsupervised
- On-line还是Off-line
- Pc还是 其他硬件设备
Rbf网络
不同的神经网络基本上都是神经元处不同
在做RBF神经网络的时候,根据已知输入输出计算出权重
这样之后就可以根据输入的数据和权重推导出输出
普通的神经网络只能将接近线性的数据进行分类/回归
RBF网络的本质就是把输入数据从一个空间转换到另外一个空间
将x1、x2通过两个函数转换成接近线性的空间,从而可以通过普通的线性\回归处理
函数为任意函数,甚至可以用自己发明的函数,只要能对网络有用
最常用的是高斯函数
RBF网络分类
- exact:所选的函数个数和输入数相同
- approximate :每次增加一个函数,直至可以使用
RBF神经网络实践
% 随机生成原始数据 ld=400; x=rand(2,ld); %0-1 x=(x-0.5)*1.5*2; %-1.5, 1.5 x1=x(1,:); x2=x(2,:); F=20+x1.^2-10*cos(2*pi*x1)+x2.^2-10*cos(2*pi*x2); %创建并训练网络 net=newrb(x,F); %生成测试数据 interval=0.1; [i, j]=meshgrid(-1.5:interval:1.5); row=size(i); tx1=i(:); tx1=tx1'; tx2=j(:); tx2=tx2'; tx=[tx1;tx2]; %测试数据测试网络 ty=sim(net,tx); v=reshape(ty,row); figure subplot(1,3,2) mesh(i,j,v); zlim([0,60]) %画出原始图 interval=0.1; [x1, x2]=meshgrid(-1.5:interval:1.5); F = 20+x1.^2-10cos(2pix1)+x2.^2-10cos(2pix2); subplot(1,3,1) mesh(x1,x2,F); zlim([0,60]) %误差图 subplot(1,3,3) mesh(x1,x2,F-v); zlim([0,60])
输出:
此图为神经网络的训练图
训练集数量的不同下图所呈现的误差不同,在该次试验中我首先测试的是100个数据,误差显示较大,但是训练的速度比较快;将训练集更改为400时,训练的速度大幅度降低,但是误差明显减小,所以可见在神经网络的训练中,二者不可兼得。
两次训练的共同点是误差基本上都出现在四个角。
Bp网络
在用神经网络进行数据分类的时候,需要获取最合适的权值,从而将数据进行分类
Bp神经网络在输入与输出之间有多层“神经元”
通过误差的值来调整权重,即从后往前更新权重
使用BP网络,对人脸的角度进行预测
- 对图像的读取、特征值的提取和设定
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'); % 当前输入层权值和阈值 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; net_1.trainParam.goal = 1e-3; % 调用 TRAINGDM 算法训练 BP 网络 [net1,tr]=train(net1,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)
- 误差值
MSE = 9.9943e-04
结果显示T和ans一一对应,误差并不大,所以测试的时候可对照ans->T来查看训练的网络是否准确
测试
输入
y = [0.9300 0.2000 0.04 0.35 3.54 2.4 1.42 1.73]'; sim(net_1,y)
输出
ans = 0.9885 -0.0051 0.9857
根据训练值设定,该值应按照[1 0 1]’ 来推导结果,返回上面看T中最后一个为 [1 0 1]’ (测试用数据用的是最后一组)