在Matlab中学习ANN(多层反向传播)

时间:2016-05-25 22:08:12

标签: matlab neural-network backpropagation

我正在为ANN(多层反向传播)的学习过程编写这段代码,但是学习的结果非常糟糕,它在任何时候都不接近1我知道我们不能保证不能成功学习但是我想知道我是否在这段代码中犯了错误,或者我是否可以通过更高的性能来完成这些步骤。

步骤:

1-上传我的数据集

2-从225选择170行进行学习,其余50行进行测试(随机)

3-在0到1之间随机创建输入和隐藏层的权重

4-在-1和1之间随机创建隐藏和输出图层的偏差

5-找到每行的输出

6-为每个隐藏层找到每个输出的错误

7-在每次迭代时更新权重和偏差数组

8-计算每次迭代时的平方误差(MSE)的总和。

每个输出的结果始终在.2和.5之间,也不适用于所需的输出。 在我的逻辑或我的代码中可能出现的错误是什么!!

注意: 1-(我使用的数据集包含225行,108列,25个结果作为类) 170行学习 用于测试的55行

2- 50,000次迭代

3-学习率0.3

4-动量= 0.7

5-隐藏层ne。 no = 90

代码:

%Initialize the weight matrices with random weights

V = rand(inlayer,hlayer); % Weight matrix from Input to Hidden between [0,1]

W = rand(hlayer,olayer); % Weight matrix from Hidden to Output between [0,1]

%Initialize the theta matrices for hidden and output layers
Thetahidden = randi(1,hlayer);
Thetaoutput = randi(1,olayer);

for i=1:iteration


for j=1:170 % depends on training data set
     %This for output between input-hidden
    for h=1:hlayer % depends on neuron number at hidden layer
        sum = 0;
        for k=1:108 % depends on column number
            sum = sum + (V(k,h)* trainingdata(j,k));
        end
        H(h) = sum + Thetahidden(h);
        Oh(h) = 1/(1+exp(-H(h)));
    end
    %This for output between hidden-output
    for o=1:olayer % depends on number of output layer
        sumO = 0;
        for hh=1:hlayer
            sumO = sumO+W(hh,o)*Oh(hh);
        end
        O(o)=sumO + Thetaoutput(o);
        OO(o) = 1/(1+exp(-O(o)));

        finaloutputforeachrow(j,o)= OO(o);

    end

    % Store real value of real output
    for r=1:170
        for o=1:olayer
            i=outputtrainingdata(r);
        if i == o
            RO(r,o)=1;
        else
            RO(r,o)=0;
        end
        end
    end


    sumerror =0;


    % Compute Error ( output layer )
    for errorout=1:olayer

        lamdaout(errorout) = OO(errorout)*(1-OO(errorout))*(RO(j,errorout)-OO(errorout));
        errorrate = RO(j,errorout)-OO(errorout);
        sumerror = sumerror+(errorrate^2);
        FinalError(j,errorout) = errorrate;
    % Compute Error ( hidden layer )
    ersum=0;
    for errorh=1:hlayer
        ersum= lamdaout(errorout)*W(errorh,errorout);
        lamdahidden(errorh)= Oh(errorh)*(1-Oh(errorh))*ersum;
    end
    FinalSumError(j) = (1/2)*sumerror;
    end

     %update weights between input and hidden layer
     for h=1:hlayer
         for k=1:108
             deltaw(k,h) = learningrate*lamdahidden(h)*trainingdata(j,k);
             V(k,h) = (m*V(k,h)) + deltaw(k,h);
         end
     end

     %update weights/Theta between hidden and output layer
     for h=1:hlayer
         for outl=1:olayer
             %weight
             deltaw2(h,outl) = learningrate * lamdaout(outl)*Oh(h);
             W(h,outl)= (m*W(h,outl))+deltaw2(h,outl);

         end
     end

     for h=1:hlayer
          %Theta-Hidden
             deltaHiddenTh(h) = learningrate * lamdahidden(h);
             Thetahidden(h) = (m*Thetahidden(h)) + deltaHiddenTh(h);
     end

    for outl=1:olayer

             %Theta-Output
             deltaOutputTh(outl) = learningrate * lamdaout(outl);
             Thetaoutput(outl) = (m*Thetaoutput(outl)) + deltaOutputTh(outl);
    end





end


end

1 个答案:

答案 0 :(得分:1)

有很多事情会影响神经网络的性能(最终收敛)。除了最近看你的代码并确保过程被正确编码之外,你可能还有一些想法可以考虑并考虑:

  • 权重的初始化范围应与网络要处理的输入have a look here相关。当输入在[-1,1]范围内时,是否有理由在[0,1]范围内?

  • 动量值会对收敛产生巨大影响。尝试不同的值。

  • 一个好的学习过程的好习惯是绘制learning curve,即错误(你的情况下的MSE)与训练时期的关系。 健康模式可以为您提供有关正在发生的事情的提示。

  • 随机设置初始权重的事实可能导致(取决于问题的复杂性)到不同的收敛点。了解这种差异有多大是有帮助的:只需训练网,再次训练几次并绘制差异。

还有隐藏神经元的数量,以及在它工作之前需要调整的各种螺钉,但乍一看,似乎你有一个非常复杂的问题( 108列和作为类)的25个结果具有太小的数据集来训练(225)。如果是这种情况,也许您需要更多数据......或者尝试其他类型的模型,而不是神经网络。

希望它有所帮助,玩得开心!