📄 bp_dl_ev_4psk.m
字号:
%动量校正BP算法
clear
%网络说明
%输入模式向量矩阵p;
%希望输出向量矩阵t;
%中间层各单元输入激活值向量S
%中间层各单元输出向量B;
%输出层各单元输入激活值向量L;
%输出实际值向量C;
%输入层至中间层的连接权W
%中间层至输出层的连接权V
%中间层各单元的阀值F1
%输出层各单元的阀值F2
%输入层数目为n1,中间层数目为n2,输出层数目为n3;
%输出层,隐含层的学习速率分别为a,b
%训练模式个数为m=7;
%%-----取20组样本的均值作为训练样本的输入------------
load('d:\lcy\AMR\design-programme-regulator\DWNN\data\learn-data-5-24f42pg-20av.mat','ppp1')
p=ppp1';
t=[0 0 0 1 1;
0 1 1 0 0;
1 0 1 0 1];
n1=5;
n3=3;
m=5;
%设置训练参数:学习速率a,b;隐含层神经元数目n2;
a=input('请输入学习速率:')
b=a
n2=input('请输入隐含层神经元个数n2:')
%---------------------------------------------------
%对神经元网络进行初始化
N=10;
S=rand(n2,1)/N;
B=rand(n2,1)/N;
L=rand(n3,1)/N;
C=rand(n3,1)/N;
W=rand(n2,n1)/N;
V=rand(n3,n2)/N;
F1=rand(n2,1)/N;
F2=rand(n3,1)/N;
sse=0; %设定全局误差清零
qwsse=0.001; %设定期望全局误差
epoch_max=20000; %设定训练最大次数
%-----------------------------------------------------
%训练网络
ddV=0;ddW=0;
for epoch=1:epoch_max
sse=0;
%-------------------输入模式顺传播
for g=1:m
S=W*p(:,g)-F1; %中间层激活值
B=1./(1+exp(-S)); %中间层输出值
L=V*B-F2; %输出层激活值
C=1./(1+exp(-L)); %实际输出值
%-------------------%输出误差逆传播
d3=(t(:,g)-C).*C.*(1-C);%第三层误差
d2=(V'*d3).*B.*(1-B); %第二层误差
dV=d3*B';
V=V+a*dV+(1-a)*ddV; %第三层权值阀值校正
F2=F2+a*d3;
dW=d2*p(:,g)';
W=W+b*dW+(1-b)*ddW; %第二层权值阀值校正
F1=F1+b*d2;
ddV=dV;ddW=dW;
sse=sse+0.5*sum((t(:,g)-C).^2);%计算全局误差
end
SSE(epoch)=sse;
if (sse>qwsse&epoch<epoch_max)
epoch=epoch+1;
% epoch
% sse
end
if sse<qwsse
% epoch
% sse
break
end
end
epoch
sse
%训练结束
%画全局误差曲线
x=1:1:epoch;
plot(x,SSE,'y--')
title('4FSK.2PSK.DQPSK.GMSK,16QAM,a=b=0.8,Emin=0.001')
xlabel('epochs')
ylabel('SSE')
hold on
%------------------------------------------------------------
% 进行性能评估:
% 设每种调制方式400个样本,其特征值向量构成的输入矩阵ppp为一个5行400列的矩阵。
% 特征向量矩阵从各个数据文件中加载。
load('d:\lcy\AMR\design-programme-regulator\DWNN\data\data-10-1-4psk.mat','ppp');
ppp=ppp' ;
enum=0;
for i=1:400
pp=ppp(:,i);
if size(pp)~=[5,1]
disp('错误输入量,请重新输入')
else S=W*pp-F1; %中间层激活值
B=1./(1+exp(-S)); %中间层输出值
L=V*B-F2; %输出层激活值
%disp('实际输出值')
C=1./(1+exp(-L)) ;
for j=1:3
% if C(j)>0.9
% if C(j)>0.99
% if C(j)>0.999
if C(j)>0.5
C(j)=1;
end
% if C(j)<0.1
% if C(j)<0.01
% if C(j)<0.001
if C(j)<0.5
C(j)=0;
end
CC(j)=C(j);
end
cc_record(i,:)=CC;
end
if CC==[0 1 1]
enum=enum+1;
end
end
disp('BP神经网络的正确识别率为:')
enum/400
%程序运行完毕
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -