📄 bp.m
字号:
function main()
SamNum = 100; %训练样本数
TestSamNum = 101; %测试样本数
HiddenUnitNum = 10; %隐节点数
InDim =1;
OutDim = 1;
%根据目标函数获得样本输入输出
rand('state',sum(100*clock))
NoiseVar = 0.1;
Noise = NoiseVar*randn(1,SamNum);
SamIn = 8*rand(1,SamNum)-4;
SamOutNoNoise = 1.1*(1-SamIn+2*SamIn.^2).*exp(-SamIn.^2/2);
SamOut = SamOutNoNoise + Noise;
TestSamIn = -4:0.08:4;
TestSamOut = 1.1*(1-TestSamIn+2*TestSamIn.^2).*exp(-TestSamIn.^2/2);
figure
hold on
grid
plot(SamIn,SamOut,'k+')
plot(TestSamIn,TestSamOut,'k--')
xlabel('Inputx');
ylabel('Outputy');
MaxEpochs = 200000;
lr = 0.003;
E0 = 0.5;
W1 = 0.2*rand(HiddenUnitNum,InDim)-0.1; %输入层到隐层的(0,0.1)初值
B1 = 0.2*rand(HiddenUnitNum,1)-0.1; %隐节点的初始阈值
W2 = 0.2*rand(OutDim,HiddenUnitNum)-0.1; %隐层到输出层的(0,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 = 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 + lr*dW1Ex;
W2Ex = W2Ex + lr*dW2Ex;
%分离隐层到输入层的权值
W2 = W2Ex(:,1:HiddenUnitNum);
end
%显示计算结果
i
W1 = W1Ex(:,1:InDim)
B1 = W1Ex(:,InDim+1)
W2
B2 = W2Ex(:,1+HiddenUnitNum)
%测试
TestHiddenOut = logsig(W1*TestSamIn + repmat(B1,1,TestSamNum));
TestNNOut = W2*TestHiddenOut + repmat(B2,1,TestSamNum);
plot(TestSamIn,TestNNOut,'r-')
%绘制学习误差曲线
figure
hold on
grid
[xx num] = size(ErrHistory);
plot(1:num,ErrHistory,'b-');
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -