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
既然你诚信诚意的推荐了,那我就勉为其难的听听吧!
数学中国社区分享快乐!
页:
[1]