yqxxqy 发表于 2011-3-22 18:34

BP网络底层程序,求高手解答~~~~~

网络结构神经元数为输入:1,隐1层:1,隐二层:2,输出:1
求高手解答!!!
我单步执行的结果是第一隐层输出饱和了。因为是为了后面的程序做准备,所以不想归一化。用工具箱的话是可以实现的。
但是从底层编的话该怎么改呢?望高手解答!心里那个急啊~~~~~~
clc
clear
k=;%输入
for i=1:length(k)
    T(i)=sum(k(1:i)); %输出
end
error_goal=0.01;%目标误差
max_epoch=200;%最大训练次数
lr=0.5;%学习速率
%% 权值阀值初始化
E=zeros(length(k),max_epoch);%误差矩阵,便于查看误差
W11=rands(1);%权值初始化
W2=rands(2,1);
=rands(1,2)
W21=W2(1)/4;W22=W2(2)/4;W31=W3(1)/4;W32=W3(2)/4;theta=theta/4;
    DW110=0;
    DW210=0;
    DW220=0;
    DW310=0;
    DW320=0;
    Dtheta0=0;
    mc=0.5;
%% 循环迭代
for j=1:max_epoch
    lr=lr/sqrt(1+j)   %防止震荡,学习效率递减
for i=1:length(k)
   
   %% 网络输出计算
    LB=1/(1+exp(-W11*k(i)))   %LB层输出 sigmod函数
    LC1=LB*W21          %LC层输出 线性函数
    LC2=LB*W22    %LC层输出  线性函数
    LD=W31*LC1+W32*LC2  %LD层输出  线性函数
    ym=LD-theta   %网络输出值
        
   
    %% 权值修正
    error=T(i)-ym  %计算误差
    E(i,j)=error;    %误差统计  
    delta3=error
    delta21=error*W31
    delta22=error*W32
    delta1=(delta21*W21+delta22*W22)*(LB*(1-LB))
    %修改权值
    DW11=lr*delta1*k(i)
    DW21=lr*delta21*LB
    DW22=lr*delta22*LB
    DW31=lr*delta3*LC1
    DW32=lr*delta3*LC2
    Dtheta=lr*delta3;
    W11=W11+DW11+mc*DW110
    W21=W21+DW21+mc*DW210
    W22=W22+DW22+mc*DW220
    W31=W31+DW31+mc*DW310
    W32=W32+DW32+mc*DW320
    theta=theta+Dtheta+mc*Dtheta0
    DW110=DW11
    DW210=DW21
    DW220=DW22
    DW310=DW31
    DW320=DW32
    Dtheta0=Dtheta
end
if sumsqr(E(:,j))<error_goal
    disp('good')
    x=input('x=')
    LB=1/(1+exp(-W11*x));   %LB层输出
    LC1=LB*W21;           %LC层输出
    LC2=LB*W22;    %LC层输出
   
    LD=W31*LC1+W32*LC2  %LD层输出
    ym=LD-theta %网络输出值
break;
end
end  
YY=0;
    for i=1:length(k)
    LB=1/(1+exp(-W11*k(i)));   %LB层输出
    LC1=LB*W21;           %LC层输出
    LC2=LB*W22;    %LC层输出
    LD=W31*LC1+W32*LC2;  %LD层输出
    ym=LD-theta;   %网络输出值
    YY=;
   
    end
     YY=YY(2:end);
    YY

杨帆 发表于 2011-3-22 19:39

既然你诚信诚意的推荐了,那我就勉为其难的听听吧!
数学中国社区分享快乐!
页: [1]
查看完整版本: BP网络底层程序,求高手解答~~~~~