📄 bp_net.m
字号:
function main()
SamNum=100; %训练样本数
HiddenUnitNum=10; %隐节点数
InDim=2; %输入样本维数
OutDim=1; %输出样本维数
%根据目标函数获得样本输入和输出
rand('state',sum(100*clock))
SamIn=8*rand(2,SamNum)-4;
x=SamIn(1,:);y=SamIn(2,:);
SamOut=cos(2*pi*x).*cos(2*pi*y);
MaxEpochs=20000; %最大训练次数
Ir=0.011; %学习率
E0=2.0; %目标误差
W1=0.2*rand(HiddenUnitNum,InDim)-0.1; %输入层到隐层的初始权值
B1=0.2*rand(HiddenUnitNum,1)-0.1; %隐节点初始阈值
W2=0.2*rand(OutDim,HiddenUnitNum)-0.1; %隐层到输出层的初始权值
B2=0.2*rand(OutDim,1)-0.1; %输出层初始阈值
W1Ex=[W1 B1]; %输入层到隐层的初始权值扩展
W2Ex=[W2 B2]; %隐层到输出层的初始权值扩展
SamInEx=[SamIn' ones(SamNum,1)]'; %输入样本扩展
ErrHistory=[]; %记录权值调整后的训练误差
for i=1:MaxEpochs
%正向计算网络各层输出
HiddenOut=logsig(W1Ex*SamInEx);
HiddenOutEx=[HiddenOut' ones(SamNum,1)]';
NetWorkOut=W2Ex*HiddenOutEx;
%判断训练是否停止
Error=SamOut-NetWorkOut; %期望输出与实际输出之差
SSE=sqrt(sumsqr(Error))
%记录每次权值调整后的训练误差
ErrHistory=[ErrHistory SSE];
if SSE<E0,break,end
%计算反向传播误差
Delta2=Error; %输出层误差
Delta1=W2'*Delta2.*HiddenOut.*(1-HiddenOut); %隐层误差
%计算权值调整量
dW2Ex=Delta2*HiddenOutEx';
dW1Ex=Delta1*SamInEx';
%权值调整
W1Ex=W1Ex+Ir*dW1Ex;
W2Ex=W2Ex+Ir*dW2Ex;
W2=W2Ex(:,1:HiddenUnitNum);
end
%显示计算结果
i
W1=W1Ex(:,1:InDim)
B1=W1Ex(:,InDim+1)
W2
B2=W2Ex(:,1+HiddenUnitNum)
%测试
%期望输出
figure
[X,Y]=meshgrid(x,y);
subplot(211)
plot3(X,Y,SamOut,'y.');
xlabel('x-label');
ylabel('y-label');
zlabel('z-label');
%实际输出
subplot(212)
plot3(X,Y,NetWorkOut,'r.');
xlabel('x-label');
ylabel('y-label');
zlabel('z-label');
%绘制学习误差曲线
figure
hold on
grid
[xx,Num]=size(ErrHistory);
plot(1:Num,ErrHistory,'g-')
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -