omb 发表于 2010-8-29 21:12

小波神经网络训练之后,权值和阈值参数有问题


大家如果有时间,帮我看看程序,小波神经网络采用10组样本进行训练,训练好之后,用该网络识别新的样本,不管样本是什么内容,最终输出的都是1。我怀疑我这个小波网络训练完之后保存的阈值和权值参数,是最后训练的那组样本所对应的阈值和权值,所以再用该网络识别其它样本,总是输出1。
各位帮我看看到底是哪里出了问题,我研究了好长时间也没发现问题在哪:'( ,拜托各位了:handshake

%小波神经网络程序
clc
clear
%step 1=========================
%定义输入样本;

x=[0.5110 0.2271 0.0558 0.1369 0.0004 0.0025 0.0577 0.0087;
    0.2322 0.3205 0.0528 0.2471 0.0002 0.0043 0.1276 0.0153;
    0.7620 0.1511 0.0067 0.0674 0.0003 0.0013 0.0082 0.0030;
    0.4412 0.2151 0.1118 0.1280 0.0008 0.0024 0.0930 0.0077;
    0.3203 0.1544 0.1779 0.1999 0.0043 0.0061 0.1224 0.0146;
    0.5220 0.3279 0.0188 0.0992 0.0001 0.0014 0.0251 0.0055;
    0.4858 0.2624 0.0415 0.1666 0.0002 0.0023 0.0333 0.0080;
    0.2683 0.4707 0.0423 0.1546 0.0003 0.0037 0.0541 0.0060;
    0.2698 0.2268 0.0752 0.3603 0.0003 0.0063 0.0352 0.0261;
    0.1283 0.4199 0.0181 0.3887 0.0007 0.0031 0.0300 0.0112]';%样本集
targ=;%目标
eta=0.02;%学习率取得适当可以加快误差的减小
aerfa=0.935;%动量因子
max_perf_inc=1.04;
lr_dec=0.7;
lr_inc=1.05;c=0.5;
%初始化连接权wjh(输出层和隐层的连接权);whi(隐层和输出层的连接权);
%假设小波函数节点数为:H个;样本数为P;
%输出节点数为:J个;输入节点数为:I个;
I=8;%输入节点数
J=1;%输出节点数
H=2*I+1;%隐层节点数
P=10;%样本数
%初始化小波参数
b=rand(H,1);%平移因子
a=rand(H,1);%伸缩因子
%初始化权系数;
whi=rand(I,H);%输入层与隐层权值
wjh=rand(H,J);%隐层与输出层权值
%阈值初始化;
b1=rand(H,1);%隐层各单元的输出阈值
b2=rand(J,1);%输出层各单元的输出阈值
p=0;
%保存的误差;
Err_NetOut=[];
% flag=1;count=0;


%进入小波神经网络的运行过程
for k=1:P
    flag(k)=1;count(k)=0;
   while flag(k)>0
         flag(k)=0;
         count(k)=count(k)+1;
         %step 2=================================
    xhp1(k)=0;
    %%%%%%%%求隐层的输入值
    for h=1:H
      for i=1:I
            xhp1(k)=xhp1(k)+whi(i,h)*x(i,k);%求权值和输入值的乘积和
      end
      ixhp(h,1)=xhp1(k)+b1(h,1);%求隐层的输入值
      xhp1(k)=0;
    end
    %%%%%%%%求隐层的输出值
    for h=1:H
      oxhp(h,1)=fai((ixhp(h,1)-b(h,1))/a(h,1));%将小波函数作为隐层的传递函数求隐层的输出值
    end
    %step 3====================================
    %%%%%%%%求输出层的输入值
    ixjp1(k)=0;
    for j=1:J
      for h=1:H
            ixjp1(k)=ixjp1(k)+wjh(h,j)*oxhp(h,1);
      end
      ixjp(j,1)=ixjp1(k)+b2(j,1);
      ixjp1(k)=0;
    end
    %%%%%%%%求输出层的输出值
    for i=1:J
      oxjp(k)=fnn(ixjp(i,1));
%         oxjp(i,k)=fnn(ixjp(i));
    end
    %step 6==保存每次误差=====
    wuchayy=1/2*sumsqr(oxjp(k)-targ(k));%求输出值与目标值差值的平方和
    Err_NetOut=;%保存每次的误差;


         %调节学习率eta==================================================
         if count(k)==1
            eta=eta;
         else
                   if Err_NetOut(count(k))/Err_NetOut(count(k)-1)>max_perf_inc
                         eta=eta*lr_dec;
                   else eta=eta*lr_inc;
                   end
          end   

    %求detaj ,detab2==================================
    %%%%%%%%%%%%%求网络参数的梯度值
    for j=1:J
      detaj(j)=-(oxjp(j,k)-targ(j,k))*oxjp(j,k)*(1-oxjp(j,k));%在误差函数中对输出层的输入值求偏导
    end
   
    for j=1:J
      for h=1:H
            detawjh(h,j)=eta*detaj(j)*oxhp(h,1);%误差函数对隐层和输出层之间的权值的偏导
      end
    end
    detab2=eta*detaj;%误差函数对输出层的阈值的偏导
   
    %求detah, detawhi detab1 detab detaa;========================
    sum=0;
    for h=1:H
      for j=1:J
            sum=detaj(j,1)*wjh(h,j)*diffai((ixhp(h)-b(h))/a(h))/a(h)+sum;%difmallet()函数是mallet()函数的导数
      end
      detah(h,1)=sum;%求误差函数对隐层输入值的偏导
      sum=0;
    end
   
    for h=1:H
      for i=1:I
            detawhi(i,h)=eta*detah(h,1)*x(i,k);%求误差函数对输入层和隐层之间的权值的偏导
      end
    end
    detab1=eta*detah;
    detab=-eta*detah;%求误差函数对小波函数中的平移因子的偏导
    for h=1:H
      detaa(h,1)=-eta*detah(h,1)*((ixhp(h,1)-b(h,1))/a(h,1));
    end
   
    %引入动量因子aerfa,修正各个系数==========================================
    wjh=wjh+(1+aerfa)*detawjh;
    whi=whi+(1+aerfa)*detawhi;
    a=a+(1+aerfa)*detaa;
    b=b+(1+aerfa)*detab;
    b1=b1+(1+aerfa)*detab1;
    b2=b2+(1+aerfa)*detab2;
    %======================================================
    %引入修正算法!!
    %判断所有的样本是否计算完==================================

      if Err_NetOut(end)>0.00005
            flag(k)=flag(k)+1;
      else
%             figure;
%             plot(Err_NetOut);
%             title('误差曲线');
%             disp('目标达到');
            disp(oxjp(k));
            disp(count(k));
      end
%   end
    if count(k)>2000
      figure;
      plot(Err_NetOut);
      title('误差曲线');
      disp('目标未达到');
      disp(oxjp(k));
      disp(count(k));
      break;
    end
    end

end
save net;

disp('=================');

%%%%%%%%%%%%%利用训练好的网络进行识别
P_test=[0.7166    0.1586    0.0108    0.0956    0.0003    0.0013    0.0095    0.0073;
    0.1438    0.0472    0.2769    0.0298    0.0019    0.0054    0.4564    0.0387;
    0.3554    0.2095    0.0742    0.2180    0.0022    0.0055    0.1225    0.0126;
    0.4503    0.0910    0.1263    0.0424    0.0030    0.0036    0.2707    0.0127;
    0.7163    0.1659    0.0137    0.0854    0.0003    0.0016    0.0115    0.0053;
    0.7815    0.1248    0.0110    0.0648    0.0001    0.0009    0.0130    0.0041;
    0.6168    0.1668    0.0179    0.1761    0.0004    0.0030    0.0109    0.0082;
    0.5499    0.0980    0.1169    0.0486    0.0017    0.0046    0.1711    0.0092]';
T_test=';
I=8;%输入节点数
J=1;%输出节点数
H=2*I+1;%隐层节点数
Err_NetOut1=[];
PP=8;
for kk=1:PP
    flag(kk)=1;count(kk)=0;
   while flag(kk)>0
         flag(kk)=0;
         count(kk)=count(kk)+1;

         %step 2=================================
    xhp12(kk)=0;
    %%%%%%%%求隐层的输入值
    for h=1:H
      for i=1:I
            xhp12(kk)=xhp12(kk)+whi(i,h)*P_test(i,kk);%求权值和输入值的乘积和
      end
      ixhp2(h,1)=xhp12(kk)+b1(h,1);%求隐层的输入值
      xhp12(kk)=0;
    end

    %%%%%%%%求隐层的输出值
    for h=1:H
      oxhp2(h,1)=fai((ixhp2(h,1)-b(h,1))/a(h,1));%将小波函数作为隐层的传递函数求隐层的输出值
    end

    %step 3====================================
    %%%%%%%%求输出层的输入值
    ixjp12(kk)=0;
    for j=1:J
      for h=1:H
            ixjp12(kk)=ixjp12(kk)+wjh(h,j)*oxhp2(h,1);
      end
      ixjp2(j,1)=ixjp12(kk)+b2(j,1);
      ixjp12(kk)=0;
    end

    %%%%%%%%求输出层的输出值
    for i=1:J
      oxjp2(kk)=fnn(ixjp2(i,1));
    end

    %step 6==保存每次误差=====
    wuchayy1=1/2*sumsqr(oxjp2(kk)-T_test(kk));%求输出值与目标值差值的平方和
   Err_NetOut1=;%保存每次的误差;
   
    if Err_NetOut1(end)>0.005
            flag(kk)=flag(kk)+1;
      else
            disp('目标达到');
            disp(oxjp2(kk));
            plot(kk,T_test(kk),'+',kk,oxjp2(kk),'o');
            hold on
            if kk==PP
            figure;
            plot(Err_NetOut1);
            title('误差曲线');

            end
      end

    if count(kk)>2000

      disp('目标未达到');
      disp(oxjp2(kk));
      disp(count(kk));
      break;
    end
    end
end

xiaopotato 发表于 2010-11-16 21:14

刚看了一些理论的东西,先看看楼主的程序。。。

605836855 发表于 2012-3-6 16:18

正研究该方向的东西中

lx24816 发表于 2012-4-15 21:13

{:{13}:}

nishoulong 发表于 2012-10-13 22:33

学习中。。。。。。

bzp小鹏 发表于 2014-7-11 10:57

Good!!!!
页: [1]
查看完整版本: 小波神经网络训练之后,权值和阈值参数有问题