2013-09-27 3 views
-1

신경망을 생성하기 위해 찾은 프로그램을 다시 작성하려고합니다. 코드가 매우 잘 작동하는 것으로 보이지만, 계속 java가됩니다. ihWeights [I] [J] = 무게 lang.NullPointerException 오류 ;, 무엇이 잘못되었는지를 알 수 없다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)); 
    } 

} 

이것은 기본 클래스를 Network.java

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); 
      } 

    } 

} 
+2

스택 추적을 포함하십시오. –

+4

모두를 위해 문제를 설명하는 데 필요한 모든 코드를 제거하십시오. 예를 들어 코드를 새로운 클래스에 복사하고 문제 코드가 남아있을 때까지 코드를 삭제합니다. [SSCCE] (http://sscce.org) 참조 – Bohemian

+0

스레드 "main"의 예외 java.lang.NullPointerException \t at Network.propWeights (Network.java:112) \t at Main.main (Main.java:16)) –

답변

3

먼저이다 ++ K] 컴파일되지 않는다. 생성자에서 닫는 중괄호.

당신이 setLayers()ihWeights를 초기화하고 있기 때문에 당신은 NullPointerException을 받고있어,하지만 당신은 ComputeOutputs()를 호출 할 때 setLayers() 전혀 호출되지 않습니다.

+0

고정되어 있으며 여전히 같은 오류가 발생합니다 ... –

관련 문제