您的位置:首页 > 理论基础 > 计算机网络

matlab实现简单BP神经网络(不使用工具箱),两种求误差方式

2017-10-10 19:55 671 查看
BP网络实现y=1+x+x*x函数模拟,输入层一个节点,隐含层8个节点,输出层1个节点

将数据分为测试集合和训练集合两部分

%% BP算法模拟 y = 1 + x + x*x
%作者:msl 时间:2017-10-07
clc;
clear;
%% step0:定义
TrainCount = 1000;%最大训练次数为2000次
DataNum = 1001;%训练的数据有1001个
Hide_Out = zeros(1,8);%初始化隐含层输出
Hide_OutTest = zeros(1,8);
Rata_H = 0.2;%隐含层学习速率
Rata_O = 0.1;%输出层学习速率
%% step1:取数据
x = -5:0.01:6;%x的训练数据
y = 1 + x + x.*x;%y对应于x的数据
%% step2:训练数据归一化和初始化权值
x_Nor = (x -(-5) + 1)/(5 - (-5) + 1);%x归一化后得到的数据
y_Nor = (y - 0.75 + 1)/(31 - 0.75 + 1);%y归一化后得到的数据
w = 2*(rand(1,8)-0.5);%得到输入层到隐含层的8个权值初始化
v = 2*(rand(1,8)-0.5);%得到隐含层到输出层的8个权值初始化
dw = zeros(1,8);%隐含层权值调整量初始化 0
dv = zeros(1,8);%输出层权值调整量初始化 0
%% CH 建立训练集和测试集
xNum=length(x);
Itest=1:11:xNum;
Xtest_Nor=x_Nor(Itest);
Ytest_Nor=y_Nor(Itest);

Xtrain_Nor=x_Nor;
Ytrain_Nor=y_Nor;
Xtrain_Nor(Itest)=[];
Ytrain_Nor(Itest)=[];

%% step3:训练神经网络
Count = 0;%循环次数计数器
e2 = 0;
while(1)
%% 主体循环
for i = 1:1000
e1 = 0;
%% 前向传播
for j = 1:8
sum1 = w(j)*Xtrain_Nor(i);%隐含层输入
Hide_Out(j) = 1/(1 + exp(-1*sum1)); %隐含层输出
end
sum2 = 0;
for k = 1:8
sum2 = sum2 + v(k)*Hide_Out(k);%输出层输入
end
OutputData = sum2;%输出层输出

e1 = e1 + abs(OutputData - Ytrain_Nor(i));
%% 反向更新
for s = 1:8
alfa = 0;
alfa = alfa + (Ytrain_Nor(i) - OutputData) * v(s);
dv(s) = Rata_O * (Ytrain_Nor(i) - OutputData) * Hide_Out(s);%更新输出层权值
v(s) = v(s) + dv(s);

dw(s) = Rata_H * alfa * Hide_Out(s) * (1 - Hide_Out(s))*Xtrain_Nor(i);%更新隐含层权值
w(s) = v(s) + dw(s);
end
end
%%CH 计算训练集误差 START
e11 = e1 / 1000;%测试样本的平均误差
myErr1(Count+1)=e11;
%%CH 计算训练集误差 END

%% 计算测试集
%%% CH STRAT
e2=0;
%%% CH END
for p = 1:100
for l = 1:8
sum3 = w(l)* Xtest_Nor(p);%测试的隐含层输入
Hide_OutTest(l) = 1/(1 + exp(-1*sum3));%测试的隐含层输出
end
sum4 = 0;
for m = 1:8
sum4 = sum4 + v(m)*Hide_OutTest(m);%测试的输出层输入
end

4000
OutputData_Test = sum4;%输出层输出
e2 = e2 + abs(OutputData_Test - Ytest_Nor(p));
end
%%CH 计算测试集误差 STRAT
e12 = e2 / 100;%测试样本的平均误差
myErr2(Count+1)=e12;
%%CH 计算测试集误差 END
%%
Count = Count + 1;%训练次数

%% 作图
figure(1);
hold on
plot(Count,e11,'r',Count,e12,'b');
hold off

if(Count >TrainCount || e12 < 0.0001)%如果训练次数大于最大训练次数或者误差小于目标值,则退出训练
break;
end
end

%plot(myErr,'r');
%stop = 1;%进入测试
%% step4:测试神经网络(输入-5到5之间数据)
% while(stop)
% n = input('请输入数据n =\n');
% A = [];%存储测试结果
%
% fprintf('计算的结果为:%lf\n',A);
% stop = input('\n输入1继续测试,输入0退出测试 stop =\n ');
% end
% fprintf('程序运行结束\n');







第一种蓝色的误差曲线是将测试集合100个数据的输出值减去期望再除以100得到的

第二种是训练集合的全局误差 采用 e = e + | Output - y |(e为误差,Output为测试集输出,y为对应的期望输出)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: