BP神经网络简单流程 BP神经网络简单流程

BP神经网络简单流程





BP(Back Propagation)神经网络是一种具有三层或者三层以上的多层神经网络,每一层都由若干个神经元组成,它的左、右各层之间各个神经元实现全连接,即左层的每一个神经元与右层的每个神经元都由连接,而上下各神经元之间无连接。BP神经网络按有导师学习方式进行训练,当一对学习模式提供给神经网络后,其神经元的激活值将从输入层经各隐含层向输出层传播,在输出层的各神经元输出对应于输入模式的网络响应。然后,按减少希望输出与实际输出误差的原则,从输出层经各隐含层,最后回到输入层(从右到左)逐层修正各连接权。由于这种修正过程是从输出到输入逐层进行的,所以称它为“误差逆传播算法”。随着这种误差逆传播训练的不断修正,网络对输入模式响应的正确率也将不断提高。

一、BP神经网络的概念

    BP神经网络是一种多层的前馈神经网络,其主要的特点是:信号是前向传播的,而误差是反向传播的。具体来说,对于如下的只含一个隐层的神经网络模型:

(三层BP神经网络模型)
BP神经网络的过程主要分为两个阶段,第一阶段是信号的前向传播,从输入层经过隐含层,最后到达输出层;第二阶段是误差的反向传播,从输出层到隐含层,最后到输入层,依次调节隐含层到输出层的权重和偏置,输入层到隐含层的权重和偏置。

二、BP神经网络的流程

    在知道了BP神经网络的特点后,我们需要依据信号的前向传播和误差的反向传播来构建整个网络。

1、网络的初始化

    假设输入层的节点个数为,隐含层的节点个数为,输出层的节点个数为。输入层到隐含层的权重,隐含层到输出层的权重为,输入层到隐含层的偏置为,隐含层到输出层的偏置为。学习速率为,激励函数为。其中激励函数为取Sigmoid函数。形式为:

2、隐含层的输出

    如上面的三层BP网络所示,隐含层的输出

3、输出层的输出


4、误差的计算

    我们取误差公式为:

其中为期望输出。我们记,则可以表示为

以上公式中,

5、权值的更新

    权值的更新公式为:

这里需要解释一下公式的由来:
这是误差反向传播的过程,我们的目标是使得误差函数达到最小值,即,我们使用梯度下降法:
  • 隐含层到输出层的权重更新
则权重的更新公式为:

  • 输入层到隐含层的权重更新
其中



则权重的更新公式为:

6、偏置的更新

    偏置的更新公式为:

  • 隐含层到输出层的偏置更新
则偏置的更新公式为:

  • 输入层到隐含层的偏置更新
其中



则偏置的更新公式为:

7、判断算法迭代是否结束

    有很多的方法可以判断算法是否已经收敛,常见的有指定迭代的代数,判断相邻的两次误差之间的差别是否小于指定的值等等。

三、实验的仿真

    在本试验中,我们利用BP神经网络处理一个四分类问题,最终的分类结果为:

MATLAB代码

主程序

[plain]  view plain  copy
  1. <span style="font-size:14px;">%% BP的主函数    
  2.     
  3. % 清空    
  4. clear all;    
  5. clc;    
  6.     
  7. % 导入数据    
  8. load data;    
  9.     
  10. %从1到2000间随机排序    
  11. k=rand(1,2000);    
  12. [m,n]=sort(k);    
  13.     
  14. %输入输出数据    
  15. input=data(:,2:25);    
  16. output1 =data(:,1);    
  17.     
  18. %把输出从1维变成4维    
  19. for i=1:2000    
  20.     switch output1(i)    
  21.         case 1    
  22.             output(i,:)=[1 0 0 0];    
  23.         case 2    
  24.             output(i,:)=[0 1 0 0];    
  25.         case 3    
  26.             output(i,:)=[0 0 1 0];    
  27.         case 4    
  28.             output(i,:)=[0 0 0 1];    
  29.     end    
  30. end    
  31.     
  32. %随机提取1500个样本为训练样本,500个样本为预测样本    
  33. trainCharacter=input(n(1:1600),:);    
  34. trainOutput=output(n(1:1600),:);    
  35. testCharacter=input(n(1601:2000),:);    
  36. testOutput=output(n(1601:2000),:);    
  37.     
  38. % 对训练的特征进行归一化    
  39. [trainInput,inputps]=mapminmax(trainCharacter');    
  40.     
  41. %% 参数的初始化    
  42.     
  43. % 参数的初始化    
  44. inputNum = 24;%输入层的节点数    
  45. hiddenNum = 50;%隐含层的节点数    
  46. outputNum = 4;%输出层的节点数    
  47.     
  48. % 权重和偏置的初始化    
  49. w1 = rands(inputNum,hiddenNum);    
  50. b1 = rands(hiddenNum,1);    
  51. w2 = rands(hiddenNum,outputNum);    
  52. b2 = rands(outputNum,1);    
  53.     
  54. % 学习率    
  55. yita = 0.1;    
  56.     
  57. %% 网络的训练    
  58. for r = 1:30    
  59.     E(r) = 0;% 统计误差    
  60.     for m = 1:1600    
  61.         % 信息的正向流动    
  62.         x = trainInput(:,m);    
  63.         % 隐含层的输出    
  64.         for j = 1:hiddenNum    
  65.             hidden(j,:) = w1(:,j)'*x+b1(j,:);    
  66.             hiddenOutput(j,:) = g(hidden(j,:));    
  67.         end    
  68.         % 输出层的输出    
  69.         outputOutput = w2'*hiddenOutput+b2;    
  70.             
  71.         % 计算误差    
  72.         e = trainOutput(m,:)'-outputOutput;    
  73.         E(r) = E(r) + sum(abs(e));    
  74.             
  75.         % 修改权重和偏置    
  76.         % 隐含层到输出层的权重和偏置调整    
  77.         dw2 = hiddenOutput*e';    
  78.         db2 = e;    
  79.             
  80.         % 输入层到隐含层的权重和偏置调整    
  81.         for j = 1:hiddenNum    
  82.             partOne(j) = hiddenOutput(j)*(1-hiddenOutput(j));    
  83.             partTwo(j) = w2(j,:)*e;    
  84.         end    
  85.             
  86.         for i = 1:inputNum    
  87.             for j = 1:hiddenNum    
  88.                 dw1(i,j) = partOne(j)*x(i,:)*partTwo(j);    
  89.                 db1(j,:) = partOne(j)*partTwo(j);    
  90.             end    
  91.         end    
  92.             
  93.         w1 = w1 + yita*dw1;    
  94.         w2 = w2 + yita*dw2;    
  95.         b1 = b1 + yita*db1;    
  96.         b2 = b2 + yita*db2;      
  97.     end    
  98. end    
  99.     
  100. %% 语音特征信号分类    
  101. testInput=mapminmax('apply',testCharacter',inputps);    
  102.     
  103. for m = 1:400    
  104.     for j = 1:hiddenNum    
  105.         hiddenTest(j,:) = w1(:,j)'*testInput(:,m)+b1(j,:);    
  106.         hiddenTestOutput(j,:) = g(hiddenTest(j,:));    
  107.     end    
  108.     outputOfTest(:,m) = w2'*hiddenTestOutput+b2;    
  109. end    
  110.     
  111. %% 结果分析    
  112. %根据网络输出找出数据属于哪类    
  113. for m=1:400    
  114.     output_fore(m)=find(outputOfTest(:,m)==max(outputOfTest(:,m)));    
  115. end    
  116.     
  117. %BP网络预测误差    
  118. error=output_fore-output1(n(1601:2000))';    
  119.     
  120. k=zeros(1,4);      
  121. %找出判断错误的分类属于哪一类    
  122. for i=1:400    
  123.     if error(i)~=0    
  124.         [b,c]=max(testOutput(i,:));    
  125.         switch c    
  126.             case 1     
  127.                 k(1)=k(1)+1;    
  128.             case 2     
  129.                 k(2)=k(2)+1;    
  130.             case 3     
  131.                 k(3)=k(3)+1;    
  132.             case 4     
  133.                 k(4)=k(4)+1;    
  134.         end    
  135.     end    
  136. end    
  137.     
  138. %找出每类的个体和    
  139. kk=zeros(1,4);    
  140. for i=1:400    
  141.     [b,c]=max(testOutput(i,:));    
  142.     switch c    
  143.         case 1    
  144.             kk(1)=kk(1)+1;    
  145.         case 2    
  146.             kk(2)=kk(2)+1;    
  147.         case 3    
  148.             kk(3)=kk(3)+1;    
  149.         case 4    
  150.             kk(4)=kk(4)+1;    
  151.     end    
  152. end    
  153.     
  154. %正确率    
  155. rightridio=(kk-k)./kk  </span>  

激活函数

[plain]  view plain  copy
  1. <span style="font-size:14px;">%% 激活函数    
  2. function [ y ] = g( x )    
  3.     y = 1./(1+exp(-x));    
  4. end  </span>  

猜你喜欢

转载自blog.csdn.net/weixin_40355324/article/details/80543391
今日推荐