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

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                             
        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');
    

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

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

第二种是训练集合的全局误差 采用 e = e + | Output - y |(e为误差,Output为测试集输出,y为对应的期望输出)

你可能感兴趣的:(fpga)