📄 bp2.m
字号:
clear;
clc;
SamNum = 81; % 训练样本数
HiddenUnitNum = 7; % 隐节点数
InDim = 1; % 样本输入维数
OutDim = 1; % 样本输出维数
SamIn = 0:0.025*pi:2*pi;
SamOut =sin(SamIn);
plot(SamIn,SamOut,'k+')
MaxEpochs = 20000; %最大训练次数
% lr = 0.003; %学习率
lr=0.001;
E0 = 0.1; %目标误差
W1 = 0.2*rand(HiddenUnitNum,InDim); %输入层到隐层的初始权值 7*1
B1 = 0.2*rand(HiddenUnitNum,1); %隐节点初始偏移 7*1
W2 = 0.2*rand(OutDim,HiddenUnitNum); %隐层到输出层的初始权值 1*7
B2 = 0.2*rand(OutDim,1); %输出层初始偏移 1*1
W1Ex = [W1 B1]; %输入层到隐层的初始权值扩展
W2Ex = [W2 B2]; %隐层到输出层的初始权值
SamInEx = [SamIn' ones(SamNum,1)]'; %样本输入扩展
for i = 1:MaxEpochs
%正向传播计算网络输出
HiddenOut = logsig(W1Ex*SamInEx);
HiddenOutEx = [HiddenOut' ones(SamNum,1)]';
NetworkOut = W2Ex*HiddenOutEx;
%停止学习判断
Error = SamOut-NetworkOut;
SSE = sumsqr(Error)/2;
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);
% 测试
hold on;
plot(SamIn,NetworkOut,'k-')
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -