簡體   English   中英

java.lang.NullPointerException,無法找出問題所在

[英]java.lang.NullPointerException , can't find out what is wrong

我正在嘗試重寫一個我發現用於創建神經網絡的程序,代碼似乎非常好(對我來說至少是這樣),但是我不斷收到ihWeights [i] [j] = weights [k ++];的java.lang.NullPointerException錯誤,無法找出問題所在

public class Network {

        int numInput,numHidden,numOutput;

        private  double[]InputLayer;
        private  double[]OutputLayer;


        private  double[][]ihWeights;
        private  double[]ihBias;
        private  double[]ihSums;
        private  double[] ihOutput;

        private  double[][]hoWeights;
        private  double[]hoBias;
        private  double[]hoSums;





                public  Network(int i,int h,int o){
                    this.numInput=i;
                    this.numHidden=h;
                    this.numOutput=o;
    InputLayer = new double[numInput];
              ihWeights = MakeMatrix(numInput, numHidden);

              ihBias = new double[numHidden];
              ihSums = new double[numHidden];
              ihOutput = new double[numHidden];
              hoWeights = MakeMatrix(numHidden, numOutput);

              hoSums = new double[numOutput];
              hoBias = new double[numOutput];

              OutputLayer = new double[numOutput];
}








    public void propWeights(double[] weights){

 int numWeights = (numInput * numHidden) + (numHidden * numOutput) + numHidden + numOutput;
 if (weights.length != numWeights)
    System.out.println("Size of arrays doesn't match");


 int k=0;

 for (int i = 0; i <= numInput; i++)
  for (int j = 0; j <= numHidden; j++)
   ihWeights[i][j] = weights[k++];

for (int i = 0; i < numHidden; ++i)
 ihBias[i] = weights[k++];
for (int i = 0; i < numHidden; ++i)
 for (int j = 0; j < numOutput; ++j)
   hoWeights[i][j] = weights[k++];
for (int i = 0; i < numOutput; ++i)
 hoBias[i] = weights[k++];

    }


    public static double[][] MakeMatrix(int rows, int cols)
    {
      double[][] result = new double[rows][];
      for (int i = 0; i < rows; ++i)
        result[i] = new double[cols];
      return result;
    }



    public double[] ComputeOutputs(double[] xValues)
    {
     if (xValues.length != numInput)
          System.out.println("Size of arrays doesn't match");
          for (int i = 0; i < numHidden; ++i)
            ihSums[i] = 0.0;
          for (int i = 0; i < numOutput; ++i)
            hoSums[i] = 0.0;
        for (int i = 0; i < xValues.length; ++i)
          this.InputLayer[i] = xValues[i];
        for (int j = 0; j < numHidden; ++j)
          for (int i = 0; i < numInput; ++i)
            ihSums[j] += this.InputLayer[i] * ihWeights[i][j];
        for (int i = 0; i < numHidden; ++i)
          ihSums[i] += ihBias[i];
        for (int i = 0; i < numHidden; ++i)
          ihOutput[i] = Network.SigmoidFunction(ihSums[i]);



        for (int j = 0; j < numOutput; ++j)
          for (int i = 0; i < numHidden; ++i)
            hoSums[j] += ihOutput[i] * hoWeights[i][j];
        for (int i = 0; i < numOutput; ++i)
          hoSums[i] += hoBias[i];
        for (int i = 0; i < numOutput; ++i)             
            this.OutputLayer[i] = SigmoidFunction(hoSums[i]);
          double[] result = new double[numOutput];
         result=OutputLayer;
          return result;
    }

    public static double SigmoidFunction(double x)
    {
     /*
      * if (x < -45.0) return 0.0;                 
      else if (x > 45.0) return 1.0;
      else
      */ return 1.0 / (1.0 + Math.exp(-x));
    }

}

這是主要的課程

public class Main {

    /**
     * @param args
     */
    public static void main(String[] args) {

        Network N=new Network(3, 4, 2); 

        double[] weights = new double[] {
                  0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0, 1.1, 1.2,
                  -2.0, -6.0, -1.0, -7.0,
                  1.3, 1.4, 1.5, 1.6, 1.7, 1.8, 1.9, 2.0,
                  -2.5, -5.0 };
        N.propWeights(weights);
          double[] xValues = new double[] { 1.0, 2.0, 3.0 };
          double[] yValues = N.ComputeOutputs(xValues);

          for(double n:yValues){
              System.out.println(n);
          }

    }

}

首先, Network.java無法編譯-您在構造函數中缺少右括號。

因為在setLayers()初始化ihWeights ,所以得到了NullPointerException ,但是在調用ComputeOutputs()時根本不會調用setLayers() ComputeOutputs()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM