📄 bp3.m
字号:
clear all;
clc;
%=============初始化
eta = 0.003; % 学习率
epsilon = 0.4; % 目标误差
N_max = 20000; % 最大学习次数
W = -0.1+0.2*rand(10,2); % 输入层到隐含层的初始权值
V = -0.1+0.2*rand(1,11); % 隐含层到输出层的初始权值
x1 = -4+8*rand(1,100); % 输入信号
x2 = ones(1,100); % 阈值
X = [x1;x2]; % 初始输入模式向量
Noise = 0.1*randn(1,100);
%=============计算输出层的希望值
F = 1.1*(1-x1+2*x1.^2).*exp(-(x1.^2)/2)+Noise;
%=============下面进行网络训练
for N = 1:N_max % N为训练次数
for k = 1:length(x1) % k为第k个模式
% (1)输入模式顺序传播
NET1 = W*X(:,k); % 输入层到隐含层的激活矩阵
B = 1./(1+exp(-NET1)); % 隐含层的实际输出矩阵(标准Sigmoidal激活函数)
B1 = [B;1];
NET2 = V*B1; % 隐含层到输出层的激活矩阵
Y(:,k) = NET2; % 输出层的实际输出矩阵(线性激活函数)
% (2)输出误差的逆传播
E(:,k) = (F(:,k) - Y(:,k)).^2; % 输出层的误差
Rr = F(:,k)-Y(:,k); % 输出层的学习信号
Rp = B1.*(1-B1).*(V'*Rr);% 隐含层的学习信号
V = V+eta*Rr*B1'; % 输出层权值的更新
W = W+eta*Rp(1:end-1,:)*X(:,k)'; % 输入层权值的更新
%========第k个模式的权值更新完毕
end
E_sum = sum(E,1);
E_mean(N) = mean(E_sum); % k个模式的平均误差
n(N) = N;
if E_mean(N)<epsilon
break;
end
end
plot(n,E_mean);grid on;
xlabel('训练次数');ylabel('所有模式的平均误差');
title('学习误差曲线,最大学习次数N_{max}=10000,\eta=0.1,\epsilon=0.01');
xlim([0 N]);
% 下面利用训练好的网络绘制图形
%=============产生输入模式矢量
x1 = linspace(-4,4,100); % 输入信号
x2 = ones(1,100); % 阈值
X = [x1;x2]; % 初始输入模式向量
Noise = 0.1*randn(1,100);
%=============计算输出层的希望值
F1 = 1.1*(1-x1+2*x1.^2).*exp(-(x1.^2)/2)+Noise;
%=============下面进行函数逼近
for i = 1:length(x1)
NET1 = W*X(:,i); % 输入层到隐含层的激活矩阵
B = 1./(1+exp(-NET1)); % 隐含层的实际输出矩阵(标准Sigmoidal激活函数)
B1 = [B;1];
NET2 = V*B1; % 隐含层到输出层的激活矩阵
Y1(:,i) = NET2; % 输出层的实际输出矩阵(线性激活函数)
end
%============绘制理想图形和逼近图形
figure;
plot(x1,F1(1,:),'r');grid on;hold on;
plot(x1,Y1(1,:),'b');
xlabel('自变量');ylabel('函数值');
title('理想函数与逼近函数的对比,最大学习次数N_{max}=20000,\eta=0.003,\epsilon=0.5');
legend('理想函数曲线','逼近函数曲线');
disp('运算结果:------------->');
disp('目标误差:');
disp(E_mean(end));
disp('学习次数:');
disp(N);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -