代码之家  ›  专栏  ›  技术社区  ›  user366312

神经网络代码解释

  •  0
  • user366312  · 技术社区  · 9 年前

    以下是中提供的简单感知器的实现 a blog .

    input = [0 0; 0 1; 1 0; 1 1];
    numIn = 4;
    desired_out = [0;1;1;1];
    bias = -1;
    coeff = 0.7;
    rand('state',sum(100*clock));
    weights = -1*2.*rand(3,1);
    
    iterations = 10;
    
    for i = 1:iterations
         out = zeros(4,1);
         for j = 1:numIn
              y = bias*weights(1,1)+...
                   input(j,1)*weights(2,1)+input(j,2)*weights(3,1);
              out(j) = 1/(1+exp(-y));
              delta = desired_out(j)-out(j);
              weights(1,1) = weights(1,1)+coeff*bias*delta;
              weights(2,1) = weights(2,1)+coeff*input(j,1)*delta;
              weights(3,1) = weights(3,1)+coeff*input(j,2)*delta;
         end
    end
    

    我有以下问题:,

    (1) 这里哪一个是训练数据?

    (2) 这里哪一个是测试数据?

    (3) 这里的标签是什么?

    1 回复  |  直到 9 年前
        1
  •  1
  •   Saeed Masoomi    9 年前

    在另一个视图中,训练数据为[0,0;0,1;1,0;1,1],每一行都是一组训练数据,如下所示:

        >> input
    
    input =
    
     0     0
     0     1
     1     0
     1     1
    

    目标是

       desired_out =
    
     0
     1
     1
     1
    

    请考虑一下 这是您的标签 .. 训练数据(输入)中的每一行在二进制集合{0,1}中都有一个特定的输出(标签)(因为本示例用于实现OR逻辑电路)。

    在matlab中,您可以使用或函数如下,以进一步了解:

        >> or(0,0)
    
        ans =
    
            0
    
        >> or(1,0)
    
        ans =
    
            1
    
        >> or(0,1)
    
       ans =
    
           1
    
       >> or(1,1)
    
       ans =
    
           1
    

    请注意,您的代码没有任何训练测试,这段代码只是试图获得感知器的权重和其他参数,但您可以通过一个小程序将训练测试添加到代码中

        NumDataTest  =  10 ;
        test=randi( [0 , 1] , [ NumDataTest , 2]) ...
           +(2*rand(NumDataTest,2)-1)/20;
    

    因此,测试数据将类似于以下内容:

         test =
    
        1.0048    1.0197
        0.0417    0.9864
       -0.0180    1.0358
        1.0052    1.0168
        1.0463    0.9881
        0.9787    0.0367
        0.9624   -0.0239
        0.0065    0.0404
        1.0085   -0.0109
       -0.0264    0.0429
    

    为了测试这些数据,您可以通过以下代码使用自己的程序:

        for i=1:NumDataTest
            y = bias*weights(1,1)+test(i,1)*weights(2,1)+test(i,2)*weights(3,1);
            out(i) = 1/(1+exp(-y));
        end
    

    最后:

         table(test(:,1),test(:,2),out,'VariableNames',{'input1' 'input2' 'output'})
    

    输出是

             input1       input2       output 
            _________    _________    ________
    
              1.0048       1.0197     0.99994
              0.041677      0.98637     0.97668
             -0.017968       1.0358     0.97527
              1.0052       1.0168     0.99994
              1.0463      0.98814     0.99995
              0.97875     0.036674      0.9741
              0.96238    -0.023861     0.95926
              0.0064527     0.040392    0.095577
              1.0085    -0.010895     0.97118
             -0.026367     0.042854    0.080808
    

    代码部分:

        clc
        clear
        input = [0 0; 0 1; 1 0; 1 1];
        numIn = 4;
        desired_out = [0;1;1;1];
        bias = -1;
        coeff = 0.7;
        rand('state',sum(100*clock));
        weights = -1*2.*rand(3,1);
    
        iterations = 100;
    
        for i = 1:iterations
        out = zeros(4,1);
            for j = 1:numIn
               y = bias*weights(1,1)+input(j,1)*weights(2,1)+input(j,2)*weights (3,1);
               out(j) = 1/(1+exp(-y));
               delta = desired_out(j)-out(j);
               weights(1,1) = weights(1,1)+coeff*bias*delta;
               weights(2,1) = weights(2,1)+coeff*input(j,1)*delta;
               weights(3,1) = weights(3,1)+coeff*input(j,2)*delta;
            end
       end
       %% Test Section
       NumDataTest  =  10 ;
       test=randi( [0 , 1] , [ NumDataTest , 2]) ...
          +(2*rand(NumDataTest,2)-1)/20;
       for i=1:NumDataTest
           y = bias*weights(1,1)+test(i,1)*weights(2,1)+test(i,2)*weights(3,1);
           out(i) = 1/(1+exp(-y));
       end
        table(test(:,1),test(:,2),out,'VariableNames',{'input1' 'input2' 'output'})
    

    我希望这对我有帮助,如果我的英语不好,我也很抱歉