⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bpdetail.m

📁 包含了matlab实现bp神经网络模型的三段源码
💻 M
字号:
%严格按照BP网络计算公式来设计的一个matlab程序,对BP网络进行了优化设计
%优化1:设计了yyy,即在o(k)计算公式时,当网络进入平坦区时(<0.0001)学习率加大,  出来后学习率又还原 P68 3.30
%优化2:v(i,j)=v(i,j)+deltv(i,j)+a*dv(i,j); 参照了P67 3.29

clear all
clc
inputNums=3;              %输入层节点
outputNums=3;             %输出层节点
hideNums=10;              %隐层节点数
maxcount=20000;           %最大迭代次数
samplenum=3;              %一个计数器,无意义
precision=0.001;          %预设精度
yyy=1.3;                  %yyy是帮助网络加速走出平坦区 

alpha=0.01;                %学习率设定值
a=0.5;                    %BP优化算法的一个设定值,对上组训练的调整值按比例修改
error=zeros(1,maxcount+1);  %error数组初始化;目的是预分配内存空间
errorp=zeros(1,samplenum);%同上

v=rand(inputNums,hideNums);      %3*10;v初始化为一个3*10的随机归一矩阵; v表输入层到隐层的权值
deltv=zeros(inputNums,hideNums); %3*10;内存空间预分配
dv=zeros(inputNums,hideNums);    %3*10;  


w=rand(hideNums,outputNums);     %10*3;同V
deltw=zeros(hideNums,outputNums);%10*3
dw=zeros(hideNums,outputNums);   %10*3


samplelist=[0.1323,0.323,-0.132;0.321,0.2434,0.456;-0.6546,-0.3242,0.3255];  %3*3;指定输入值3*3(实为3个向量)
expectlist=[0.5435,0.422,-0.642;0.1,0.562,0.5675;-0.6464,-0.756,0.11];  %3*3;期望输出值3*3(实为3个向量),有导师的监督学习

count=1;
while (count<=maxcount)          %结束条件1迭代2000次
    c=1;
    while (c<=samplenum)
      for k=1:outputNums 
        d(k)=expectlist(c,k);    %获得期望输出的向量,d(1:3)表示一个期望向量内 的值
      end
    
      for i=1:inputNums
        x(i)=samplelist(c,i);    %获得输入的向量(数据),x(1:3)表一个训练向量
      end

%Forward();
     for j=1:hideNums
         net=0.0;
           for i=1:inputNums
               net=net+x(i)*v(i,j);%输入层到隐层的加权和∑X(i)V(i)               3.11
           end
         y(j)=1/(1+exp(-net));     %输出层处理f(x)=1/(1+exp(-x))单极性sigmiod函数 3.14
     end
     for k=1:outputNums
         net=0.0;
         for j=1:hideNums
             net=net+y(j)*w(j,k);
         end
         if count>=2&&error(count)-error(count+1)<=0.0001
            o(k)=1/(1+exp(-net)/yyy);
         else o(k)=1/(1+exp(-net));     %同上
         end
     end

%BpError(c)反馈/修改;
    errortmp=0.0;
    for k=1:outputNums
        errortmp=errortmp+(d(k)-o(k))^2;  %第一组训练后的误差计算
    end
    errorp(c)=0.5*errortmp;               %误差E=∑(d(k)-o(k))^2 * 1/2      3.15
%end
      
      %Backward();
    for k=1:outputNums
        yitao(k)=(d(k)-o(k))*o(k)*(1-o(k)); %输入层误差偏导                  3.25a
    end
    for j=1:hideNums
        tem=0.0;
        for k=1:outputNums
            tem=tem+yitao(k)*w(j,k);         %为了求隐层偏导,而计算的∑
        end
         yitay(j)=tem*y(j)*(1-y(j));         %隐层偏导                      3.25b
     end

   %调整各层权值
   for j=1:hideNums
       for k=1:outputNums
           deltw(j,k)=alpha*yitao(k)*y(j);    %权值w的调整量deltw(已乘学习率)3.26a
           w(j,k)=w(j,k)+deltw(j,k)+a*dw(j,k);%权值调整,这里的dw=dletw(t-1),实际是对BP算法的一个
           dw(j,k)=deltw(j,k);                %改进措施--增加动量项目的是提高训练速度          
       end                                                                 %3.29
   end
   for i=1:inputNums
       for j=1:hideNums
           deltv(i,j)=alpha*yitay(j)*x(i);     %同上deltw
           v(i,j)=v(i,j)+deltv(i,j)+a*dv(i,j); 
           dv(i,j)=deltv(i,j);
       end
   end
    c=c+1;
    end%第二个while结束;表示一次BP训练结束
    
    double tmp;
    tmp=0.0;
    for i=1:samplenum
      tmp=tmp+errorp(i)*errorp(i);%误差求和
    end
    tmp=tmp/c;
    error(count)=sqrt(tmp);%误差求均方根,即精度

    if (error(count)<precision)%另一个结束条件
      break;
     end
    count=count+1;%训练次数加1
end%第一个while结束
error(maxcount+1)=error(maxcount);
p=1:count;
pp=p/50;
plot(pp,error(p),'-'); %显示误差

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -