⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 nnd12ls.m

📁 matlab在神经网络中的一些界面函数
💻 M
📖 第 1 页 / 共 2 页
字号:

    % PLOT PATH
    set(fig,'pointer','watch')

    % INITIALIZE TRAINING
    Lx = x;
    Ly = y;
    if option == 1
      W1(1,1) = x;
      W2(1,1) = y;
    elseif option == 2
      W1(1,1) = x;
      b1(1) = y;
    else
      b1(1) = x;
      b1(2) = y;
    end

    A1 = logsig(W1*P+b1*ones(1,Q));
    A2 = logsig(W2*A1+b2*ones(1,Q));
    E = T-A2;
    fa=sumsqr(E);

    D2 = A2.*(1-A2).*E;
    D1 = A1.*(1-A1).*(W2'*D2);
    gW1 = D1*P';
    gb1 = D1*ones(Q,1);
    gW2 = D2*A1';
    gb2 = D2*ones(Q,1);

    if (option == 1)
      nrmo = gW1(1,1)^2 + gW2(1,1)^2;
    elseif(option == 2)
      nrmo = gW1(1,1)^2 + gb1(1)^2;
    else
      nrmo = gb1(1)^2 + gb1(2)^2;
    end

    % NORM OF GRADIENT
    nrmrt=sqrt(nrmo);

    % INITIALIZE DIRECTION
    dW1old=gW1;db1old=gb1;dW2old=gW2;db2old=gb2;
    dW1=gW1/nrmrt;db1=gb1/nrmrt;dW2=gW2/nrmrt;db2=gb2/nrmrt;

    % ASSIGN PARAMETERS
    tau=0.618;
    tau1=1-tau;
    scaletol=20;
    delta=0.32;
    delta1=.03;
    tol=delta1/scaletol;
    scale=2.0;
    bmax=26;
    n=2;                 %number of steps before reset

    % MAIN LOOP
    max_epoch = 3;
    disp_freq = 1;
    for epoch=1:(max_epoch)
    
      % INITIALIZE A
      a=0;
      aold=0;
      b=delta;
      faold=fa;

      % CALCULATE INITIAL SSE 
      W1t = W1; b1t = b1;
      W2t = W2; b2t = b2;
      if (option == 1)
        newx = W1(1,1) + b*dW1(1,1); W1t(1,1) = newx;
        newy = W2(1,1) + b*dW2(1,1); W2t(1,1) = newy;
      elseif(option == 2)
        newx = W1(1,1) + b*dW1(1,1); W1t(1,1) = newx;
        newy = b1(1)   + b*db1(1);   b1t(1) = newy;
      else
        newx = b1(1) + b*db1(1);   b1t(1) = newx;
        newy = b1(2) + b*db1(2);   b1t(2) = newy;
      end
    
      fb = sumsqr(T - logsig(W2t*logsig(W1t*P+b1t*ones(1,Q))+b2t*ones(1,Q)));
    
      % FIND INITIAL INTERVAL WHERE SSE MINIMUM OCCURS
      while (fa>fb)&(b<bmax)
        aold=a;
        faold=fa;
        fa=fb;
        a=b;
        b=scale*b;
        if (option == 1)
          newx = W1(1,1) + b*dW1(1,1); W1t(1,1) = newx;
          newy = W2(1,1) + b*dW2(1,1); W2t(1,1) = newy;
        elseif(option == 2)
          newx = W1(1,1) + b*dW1(1,1); W1t(1,1) = newx;
          newy = b1(1)   + b*db1(1);   b1t(1) = newy;
        else
          newx = b1(1) + b*db1(1);   b1t(1) = newx;
          newy = b1(2) + b*db1(2);   b1t(2) = newy;
        end
      fb = sumsqr(T - logsig(W2t*logsig(W1t*P+b1t*ones(1,Q))+b2t*ones(1,Q)));
        xc=circ_x2+newx;
        yc=circ_y2+newy;
        path = [path; fill(xc,yc,'w','facecolor','none','erasemode','none','EdgeColor','b')];
      end
      xc=circ_x2+newx;
      yc=circ_y2+newy;
      path = [path; fill(xc,yc,'w','facecolor','none','erasemode','none','EdgeColor','b')];
      a=aold;
      fa=faold;
    
      % SHOW INITIAL INTERVAL
      if (option == 1)
        newx = W1(1,1) + a*dW1(1,1);
        newy = W2(1,1) + a*dW2(1,1);
      elseif(option == 2)
        newx = W1(1,1) + a*dW1(1,1);
        newy = b1(1)   + a*db1(1);
      else
        newx = b1(1) + a*db1(1);
        newy = b1(2) + a*db1(2);
      end
      xc=circ_x3+newx;
      yc=circ_y3+newy;
      path = [path; fill(xc,yc,'k','facecolor','none','erasemode','none','EdgeColor','k')];
    
      if (option == 1)
        newx = W1(1,1) + b*dW1(1,1);
        newy = W2(1,1) + b*dW2(1,1);
      elseif(option == 2)
        newx = W1(1,1) + b*dW1(1,1);
        newy = b1(1)   + b*db1(1);
      else
        newx = b1(1) + b*db1(1);
        newy = b1(2) + b*db1(2);
      end
      xc=circ_x3+newx;
      yc=circ_y3+newy;
      path = [path; fill(xc,yc,'k','facecolor','none','erasemode','none','EdgeColor','k')];
    
      % INITIALIZE C AND D
      c=a+tau1*(b-a);
      if (option == 1)
        newx = W1(1,1) + c*dW1(1,1); W1t(1,1) = newx;
        newy = W2(1,1) + c*dW2(1,1); W2t(1,1) = newy;
      elseif(option == 2)
        newx = W1(1,1) + c*dW1(1,1); W1t(1,1) = newx;
        newy = b1(1)   + c*db1(1);   b1t(1) = newy;
      else
        newx = b1(1) + c*db1(1);   b1t(1) = newx;
        newy = b1(2) + c*db1(2);   b1t(2) = newy;
      end
      fc = sumsqr(T - logsig(W2t*logsig(W1t*P+b1t*ones(1,Q))+b2t*ones(1,Q)));
      xc=circ_x1+newx;
      yc=circ_y1+newy;
      path = [path; fill(xc,yc,'k','erasemode','none','EdgeColor','k')];
      d=b-tau1*(b-a);
      if (option == 1)
        newx = W1(1,1) + d*dW1(1,1); W1t(1,1) = newx;
        newy = W2(1,1) + d*dW2(1,1); W2t(1,1) = newy;
      elseif(option == 2)
        newx = W1(1,1) + d*dW1(1,1); W1t(1,1) = newx;
        newy = b1(1)   + d*db1(1);   b1t(1) = newy;
      else
        newx = b1(1) + d*db1(1);   b1t(1) = newx;
        newy = b1(2) + d*db1(2);   b1t(2) = newy;
      end
      fd = sumsqr(T - logsig(W2t*logsig(W1t*P+b1t*ones(1,Q))+b2t*ones(1,Q)));
      xc=circ_x1+newx;
      yc=circ_y1+newy;
      path = [path; fill(xc,yc,'k','erasemode','none','EdgeColor','k')];
    
      % MINIMIZE ALONG A LINE
      k=0;
      while (b-a)>tol 
        if ( (fc<fd)&(fb>=min([fa fc fd])) ) | fa<min([fb fc fd])
          b=d; d=c; fb=fd;
          c=a+tau1*(b-a);
          fd=fc;
          if (option == 1)
            newx = W1(1,1) + c*dW1(1,1); W1t(1,1) = newx;
            newy = W2(1,1) + c*dW2(1,1); W2t(1,1) = newy;
          elseif(option == 2)
            newx = W1(1,1) + c*dW1(1,1); W1t(1,1) = newx;
            newy = b1(1)   + c*db1(1);   b1t(1) = newy;
          else
            newx = b1(1) + c*db1(1);   b1t(1) = newx;
            newy = b1(2) + c*db1(2);   b1t(2) = newy;
          end
          fc = sumsqr(T - logsig(W2t*logsig(W1t*P+b1t*ones(1,Q))+b2t*ones(1,Q)));
          xc=circ_x1+newx;
          yc=circ_y1+newy;
          path = [path; fill(xc,yc,'k','erasemode','none','EdgeColor','k')];
    
        else
          a=c; c=d; fa=fc;
          d=b-tau1*(b-a);
          fc=fd;
          if (option == 1)
            newx = W1(1,1) + d*dW1(1,1); W1t(1,1) = newx;
            newy = W2(1,1) + d*dW2(1,1); W2t(1,1) = newy;
          elseif(option == 2)
            newx = W1(1,1) + d*dW1(1,1); W1t(1,1) = newx;
            newy = b1(1)   + d*db1(1);   b1t(1) = newy;
          else
            newx = b1(1) + d*db1(1);   b1t(1) = newx;
            newy = b1(2) + d*db1(2);   b1t(2) = newy;
          end
          fd = sumsqr(T - logsig(W2t*logsig(W1t*P+b1t*ones(1,Q))+b2t*ones(1,Q)));
          xc=circ_x1+newx;
          yc=circ_y1+newy;
          path = [path; fill(xc,yc,'k','erasemode','none','EdgeColor','k')];
        end
      end

      xc=circ_x1+newx;
      yc=circ_y1+newy;
      path = [path; plot(xc,yc,'.','color',nnred,'erasemode','none','markersize',15)];

      % UPDATE VARIABLES
      if (option == 1)
        newx = W1(1,1) + a*dW1(1,1); W1(1,1) = newx;
        newy = W2(1,1) + a*dW2(1,1); W2(1,1) = newy;
      elseif(option == 2)
        newx = W1(1,1) + a*dW1(1,1); W1(1,1) = newx;
        newy = b1(1)   + a*db1(1);   b1(1) = newy;
      else
        newx = b1(1) + a*db1(1);   b1(1) = newx;
        newy = b1(2) + a*db1(2);   b1(2) = newy;
      end
    
      % CALCULATE GRADIENT
      A1 = logsig(W1*P+b1*ones(1,Q));
      A2 = logsig(W2*A1+b2*ones(1,Q));
      E = T-A2;
      D2 = A2.*(1-A2).*E;
      D1 = A1.*(1-A1).*(W2'*D2);
      gW1 = D1*P';
      gb1 = D1*ones(Q,1);
      gW2 = D2*A1';
      gb2 = D2*ones(Q,1);
    
      % NORM SQUARE OF GRADIENT
      if (option == 1)
        nrmn = gW1(1,1)^2 + gW2(1,1)^2;
      elseif(option == 2)
        nrmn = gW1(1,1)^2 + gb1(1)^2;
      else
        nrmn = gb1(1)^2 + gb1(2)^2;
      end

      % CALCULATE DIRECTION
      if rem(epoch,n)==0
        Z=0;
      else
        Z=nrmn/nrmo;
      end

      % CALCULATE NEW DIRECTIONS
      dW1new = gW1 + dW1old*Z; db1new = gb1 + db1old*Z;
      dW2new = gW2 + dW2old*Z; db2new = gb2 + db2old*Z;

      % SAVE NEW DIRECTIONS
      dW1old = dW1new; db1old = db1new;
      dW2old = dW2new; db2old = db2new;
      nrmo=nrmn;

      %NORMALIZE DIRECTIONS
      if (option == 1)
        nrm = sqrt(dW1new(1,1)^2 + dW2new(1,1)^2);
      elseif(option == 2)
        nrm = sqrt(dW1new(1,1)^2 + db1new(1)^2);
      else
        nrm = sqrt(db1new(1)^2 + db1new(2)^2);
      end
      dW1=dW1new/nrm;db1=db1new/nrm;dW2=dW2new/nrm;db2=db2new/nrm;

      % DISPLAY PROGRESS
      if rem(epoch,disp_freq) == 0
        xc=circ_x3+newx;
        yc=circ_y3+newy;
        Lx = newx;
        Ly = newy;
      end
    end

    % OPTIMAL SOLUTIONS
    if option == 1
      optx = 10;
      opty = 1;
    elseif option == 2
      optx = 10;
      opty = -5;
    else
      optx = -5;
      opty = 5;
    end
    xc=circ_x2+optx;
    yc=circ_y2+opty;
    path = [path; fill(xc,yc,'w','erasemode','none','EdgeColor','b')];

    % CONTOUR PLOT
    set(fig,'nextplot','new')
    
    % SAVE DATA
    set(path_ptr,'userdata',path);
    set(fig,'pointer','arrow')

  end
end

    

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -