2011-07-05 4 views
0

내 응용 프로그램에 NeuronDotNet을 사용하고 싶습니다. 이 코드와이 클래스를 사용하려고하면NeuronDotNet에 문제가있어서 C#

using NeuronDotNet.Core; 

public class CostomNeuralNetwork 
     { 
      public static double[] SampleInput = new double[] {4, 2, 8, 6, 15, 49, 22}; 
      public static double[] SampleOutput = new double[] {4, 2}; 

      private BackpropagationNetwork network; 

      public CostomNeuralNetwork() 
      { 
       var inputLayer = new LinearLayer(7); 
       var hiddenLayer = new SigmoidLayer(20); 
       var outputLayer = new SigmoidLayer(2); 

       new BackpropagationConnector(inputLayer, hiddenLayer).Initializer = new RandomFunction(0d, 0.3d); 
       new BackpropagationConnector(hiddenLayer, outputLayer).Initializer = new RandomFunction(0d, 0.3d); 

       network = new BackpropagationNetwork(inputLayer, outputLayer); 
       network.SetLearningRate(0.3); 
      } 

      public void Train(double[] input,double []output) 
      { 
       var set = new TrainingSet(7, 2); 
       set.Add(new TrainingSample(input, output)); 
       network.Learn(set, 10000); 
      } 

      public double[] Estimate(double[] input) 
      { 
       var res = network.Run(input); 
       return res; 
      } 
     } 

: 이 클래스를 고려하시기 바랍니다

var costomNetwork = new CostomNeuralNetwork(); 
      costomNetwork.Train(CostomNeuralNetwork.SampleInput, CostomNeuralNetwork.SampleOutput); 
      costomNetwork.Estimate(CostomNeuralNetwork.SampleInput); 

에 allways 대답은 예상 메서드에서 반환하는 것은 그 값은 1.0입니다 thow 멤버를 포함하는 이중 배열입니다 또는 0.9999923과 같은 somehething. 메쏘드 T에 전달하는 데이터가 무엇이든 관계없이 항상 답과 같은 것을 반환합니다. 나는 어떤 잘못을해서 모든 입력이 같은 결과를 반환하도록합니까? 누구든지이 코드에 동일한 문제가 있습니까?

+0

qiback를 작동 BackPrpogation 네트워크에 대한보다 1 할 필요가 귀하의 솔루션 – Johnv2020

+0

나는이 문제에 대한 해결책을 찾을 수 없습니다 ... – qiback

답변

0

여러 가지 (뉴런 수, 레이어 수, 학습 속도, 시그 모이 드 함수 등) 하드 코딩 된 것을 볼 수 있습니다. 얼마 전에 다른 라이브러리를 사용하여 ANN과 작업했을 때이 값을 많이 실험 해 보는 것이 가장 도움이된다는 것을 알았습니다. 내가 사용하고 있던 라이브러리는 네트워크가 유용 해지기 시작할 때까지 다른 값을 아주 쉽게 조정할 수있는 사용자 인터페이스를 제공했습니다.

대화식 GUI를 사용하면 네트워크 교육이 훨씬 쉬워졌습니다. GUI에서 교육 한 후 디스크에 저장 한 다음 소프트웨어에 네트워크를로드했습니다. 그런 종류의 워크 플로를 개발할 수 있다면 몇 가지 어려움을 줄일 수 있습니다.

첫 번째 제안은 교육 기간에 훨씬 낮은 가치를 시도하는 것입니다. 10000은 제게 많은 것처럼 보입니다. 너는 네트워크가 과잉 학습하는 것을 원하지 않는다. 또한 각 뉴런 연결에 대한 가중치를 볼 수있는 방법이 있다면 다른 결론을 이끌어 낼 수 있습니다.

EDIT : 여기에 한 가지 샘플이 아니라 다른 샘플 입력 및 출력으로도 연습 해보고 싶을 것입니다. 네트워크는 다양한 데이터를 학습해야합니다. 한 샘플에서 너무 철저히 가르치려고하지 마십시오.

+0

감사합니다. 하지만 다른 값으로 네트워크를 가르치더라도 항상 입력 데이터에 대해 동일한 대답을 반환합니다. 그러나 나는 연결의 각 weihght를 검사 할 것이다. 그것은 희망이 될 수도 ... – qiback

+0

어떤 가치를 바꾸고 있습니까? 당신은 뉴런 수를 변화시키고 있습니까? 레이어를 추가/제거 하시겠습니까? Sigmoid 기능을 변경하고 있습니까? 이 모든 것들을 실험 할 필요가 있습니다. – Phil

+0

@phill no 교육에 사용되는 입력 값과 입출력 설정 값을 변경하기 만하면 변경 사항이없고 대답 할 수 있습니다. – qiback

0

먼저 늦게 답변 해 주셔서 감사합니다. 이제 출력 레이어에 사용하는 활성화 함수를 살펴보십시오. Sigmoid 함수 (자세한 내용은 wikipedia 참조)는 이진 출력 (보통 S 자형의 경우 0 ~ 1)에서만 사용할 수 있습니다. 따라서 네트워크를 훈련 시키면 원하는 출력 (4,2 등)에 가장 가까운 값이기 때문에 항상 1을 결과로 얻게됩니다. 출력 장치에 선형 작동 기능을 제공하면 훨씬 효율적으로 작동합니다. 필 (Phil)과 마찬가지로 다른 매개 변수를 사용할 수도 있습니다.

  • hiddenLayer : S 자형
  • outputLayer : 여기 날 일 구성 인 선형
  • learningRate : 0.1 (0.3이 너무 높으면)
  • 에포크 : 100 (enugh 이상이지만 10000 이것은 backpropagation이고 매우 쉬운 예이므로 아무 것도 잘못 될 수 없으므로 ok입니다.)

    다음 그림에서 볼 수 있듯이, 오류가 0 매우 빠른 (5 % 정도, 즉 5 신 (新) 시대를 의미)에 도달 :

development of error

을 그리고 여기에 대한 링크입니다 프로그램 사용 : Download NNSpace. 이 프로그램 (NNSpace)은 또한을 기반으로합니다.NET Platform 및 C#을 사용하지만 각 단계를 직접 코딩하는 대신 그래픽 사용자 인터페이스를 사용합니다. 질문이 있으시면 email을 통해 저에게 연락하십시오.

편집 :가 미안 해요, 즉, I've 물론 일부 바이어스 단위를 만들어 얘기를 깜빡 했네요 (그들없이 backprop 실행됩니다 누구도), 본건 NeuronDotNet가 자동으로 수행 여부를 알 수 없다?

1

여기의 문제는 NeuronDotNet 자체에서 발생하며 구현되지 않습니다. 나는 현재 당신과 똑같은 문제에 봉착 - - 당신이 게시 할 수있는이 문제를 해결하는 경우 기본적으로 neurondotnet의 출력 훈련 데이터는 아래 코드는 잘

public class LinearNeural 
{ 
    public static double[] SampleInput = new double[] { 1d,2d,3d,4d,5d,6d,7d }; 
    public static double[] SampleOutput = new double[] { 0.01d, 0.02d, 0.06d, 0.08d, 0.10d, 0.12d, 0.14d }; 
    private double learningRate = 0.3d; 
    private int neuronCount = 10; 
    private int cycles = 100; 
    private BackpropagationNetwork network; 


    public LinearNeural() 
    { 

    } 


    public List<double> DoWork() 
    { 

     LinearLayer inputLayer = new LinearLayer(1); 
     LinearLayer hiddenLayer = new LinearLayer(neuronCount); 
     LinearLayer outputLayer = new LinearLayer(1); 
     new BackpropagationConnector(inputLayer, hiddenLayer).Initializer = new RandomFunction(0d, 0.3d); 
     new BackpropagationConnector(hiddenLayer, outputLayer).Initializer = new RandomFunction(0d, 0.3d); 
     network = new BackpropagationNetwork(inputLayer, outputLayer); 
     network.SetLearningRate(learningRate); 


     TrainingSet trainingSet = new TrainingSet(1, 1); 

     for (int i = 0; i < SampleInput.Count(); i++) 
     { 
      double xVal = SampleInput[i]; 
      for (double input = SampleInput[i] - 0.05; input < SampleInput[i] + 0.06; input += 0.01) 
      { 
       trainingSet.Add(new TrainingSample(new double[] { input }, new double[] { SampleOutput[i] })); 
      } 
     } 

     network.Learn(trainingSet, cycles); 
     return StopLearning(); 

    } 


    public List<double> StopLearning() 
    { 
     var retList = new List<double>(); 
     if (network != null) 
     { 
      network.StopLearning(); 
      for (double xVal = 0; xVal < 10; xVal += 0.05d) 
      { 
       retList.Add(network.Run(new double[] {xVal})[0]); 
      } 
     } 
     return retList; 
    } 
관련 문제