2011-07-05 3 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); 

オールウェイズ答えが推定メソッドから返されると、これらの値は1.0ですThowさんのメンバーが含まれているdouble配列でありますまたは何か0.9999923のようなもの。 私はどのメソッドにデータを渡しても、それは常に答えと同じものを返します。 私は何か間違ったことをするので、どんな入力でも同じ出力が返されますか?誰もこのコードで同じ問題を抱えていますか?

+0

qibackの作品BackPrpogationネットワークの1未満であることが必要ですあなたの解決策 – Johnv2020

+0

私はこの問題のための解決策を見つけることができません... – qiback

答えて

0

私はいくつかのこと(ニューロンの数、層の数、学習率、シグモイド関数など)をハードコードしていることがわかります。しばらく前に別のライブラリを使用してANNと作業していたとき、これらの値を多く試してみることが最も効果的だとわかりました。私が使っていたライブラリは、ネットワークが有用になってしまうまで、非常に簡単にさまざまな値を微調整して実験することを可能にするユーザーインターフェイスを提供していました。

対話型GUIを使用すると、ネットワークのトレーニングがはるかに簡単になりました。 GUIでトレーニングした後、それをディスクに保存してから、自分のソフトウェアにネットワークをロードしました。そのようなワークフローを開発できる場合は、頭痛の種になる可能性があります。

私の最初の提案は、トレーニングエポックにはるかに低い値を試すことです。 10000は私のように思える。あなたはネットワークが過度に学習することを望んでいません。また、各ニューロン接続の重みを見る方法があれば、それは他の結論に導くのに役立ちます。

EDIT: あなたがここで与えた1つのサンプルではなく、異なるサンプルの入力と出力で練習してみることも間違いありません。ネットワークは、さまざまなデータを学習する必要があります。 1つのサンプルであまりにも徹底的に教えてはいけません。

+0

ありがとう。どのように多くの値を指定してネットワークを教えても、常に入力データに対して同じ答えが返されます。しかし、私は接続の各weihghtをチェックします。それは希望があるかもしれません... – qiback

+0

あなたはどのような価値を変えていますか?あなたはニューロンの数を変えていますか?レイヤーを追加/削除していますか?シグモイド関数を変更していますか?これらのことはすべて実験する必要があります。 – Phil

+0

@phill noトレーニングに使用される入力値と入出力設定値を変更するだけで、変更はありません。 – qiback

0

まず最初は、後半の返事には申し訳ありません。 出力レイヤに使用しているアクティブ化関数を見てみましょう。シグモイド関数(詳細はwikipediaを参照)は、バイナリ出力(通常のシグモイドの場合は通常0〜1)にしか使用できません。ネットワークを訓練すれば、結果として1が得られます。これは、あなたが望む出力(4,2など)に最も近い値であるためです。 出力ユニットに線形活性化関数を与えるようにしてください。これははるかにうまくいくはずです。 Philが言ったように、他のいくつかのパラメータを使うかもしれません。ここでは私のために働いた設定は次のとおりです。

  • hiddenLayer:シグモイド
  • outputLayer:リニア
  • learningRate:enughより100(以上、しかし10000:0.1(0.3が高すぎる)
  • エポックこれはバックプロパゲーションであり、非常に簡単な例であるため、何も間違っているので、これは大丈夫です)。

    次の画像で見ることができるように、誤差は0非常に高速(5つのエポックを意味5%程度を、)に達する:

development of error

そしてここでは、へのリンクですプログラム私は使用した:Download NNSpace。このプログラム(NNSpace)はまた、NETプラットフォームとC#を使用しますが、各ステップをハンドコーディングするのではなくグラフィカルユーザーインターフェイスを使用します。ご不明な点がございましたらemailまでご連絡ください。

EDIT:は申し訳ありませんが、私は、I'veはもちろんのいくつかのバイアスユニットを作成した言及を忘れてしまった(それらなしでバックプロパゲーション実行します誰も)、ドント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; 
    }