识别神经网络中的图像

时间:2015-11-25 22:13:53

标签: java image neural-network backpropagation

我正在尝试使用具有1个隐藏层的神经网络来实现识别图像的程序。用户应该绘制一个数字,NN必须识别它。而且我遇到了一些麻烦

所以我得到一个2d数组,其中1是填充像素,反之亦然。我将2d变换为1d。 1d阵列的每个元素都变成输入神经元。 我有16个隐藏的神经元和10个输出神经元。

据我了解。我需要将输出神经元放在适当的位置,使Error函数为0。

我看起来像这样。其中lvl 1是输入层,lvl2 - 隐藏层,lvl3 - 输出层。最终,其中一个输出错误大约为0,但不是必需的。期望的数组在目标函数的位置上具有1。

我实施的逻辑有问题吗?

   public void learn(int[] desired){
     for(int i =0;i<Nl3;i++)
        lvl3.get(i).SetDesired(desired[i]);

     boolean b = false;

    while(true && !b){

      for(Neuro n : lvl3)   
             n.CountError();
       CountL2Errors();
       AdjustWeights(); 

       int i = 0;
        for(Neuro n : lvl3){
            i++;
         if(n.Error < 0.00005 &&  n.Error > -0.00005){
          System.out.println(i+" "+n.Error);
           b = true;
         }
        }

    }
      System.out.println("go");
    }

对不起草率的写作,我非常困,而且这不是我的母语。

private void CountL2Errors(){ 
    for(int i = 0;i<lvl2.size();i++){
       float E = 0;
       for(int j = 0;j<lvl3.size();j++){
         E +=  lvl2.get(i).GetConnectionWeight(j)*lvl3.get(j).Error;
       }
        lvl2.get(i).SetW(E);
    }
}

Lr = 0.2
private void AdjustWeights(){
     for(int i = 0;i<lvl1.size();i++){

       for(int j = 0;j<lvl2.size();j++){
           float w =  lvl1.get(i).GetConnectionWeight(j)*LR*lvl2.get(j).Error*lvl1.get(i).GetOutput();
          lvl1.get(i).SetConnectionWeight(j, w);
       }

    }

0 个答案:

没有答案