2016-07-09 4 views
1

ここにコードです。私の単層パーセプトロンは機能しません

public class Adaline 
{ 
    private int _layer; 
    public int Layer { get { return _layer; } } 
    private int _epoch; 
    public int Epoch { get { return _epoch; } } 
    private double _error; 
    public double Error { get { return _error; } } 

    private double[] _weights; 

    public Adaline(int layer) 
    { 
     _layer = layer; 
     _weights = new double[layer]; 
     Reset(); 
    } 

    public void Reset() 
    { 
     Random r = new Random(); 
     for (int i = 0; i < _layer; i++) 
      _weights[i] = r.NextDouble() - 0.5; 
     _error = 1; 
    } 

    public void Train(BasicTrainSet<double> trainset, double learnRate) 
    { 
     double ers = 0; 
     for(int p = 0; p < trainset.DataCount; p++) 
     { 
      double result = Compute(trainset.Input[p], true); 
      double error = trainset.Output[p] - result; 

      for (int i = 0; i < _weights.Length; i++) 
      { 
       _weights[i] += error * trainset.Input[p][i] * learnRate; 
      } 

      ers += Math.Abs(error); 
     } 
     _epoch++; 
     _error = ers; 
    } 

    public double Compute(double[] input, bool quan) 
    { 
     double result = 0; 
     for (int i = 0; i < _layer; i++) 
      result += Math.Tanh(_weights[i] * input[i]); 
     //double result = _weights.Zip(input, (a, b) => Math.Tanh(a * b)).Sum(); 
     return quan ? (result >= 0 ? 1 : 0) : result; 
    } 
} 

このようにトレーニングしてゲートしようとすると、このように動作します。 Up four results are from this code アルゴリズムに問題がないので、これはかなり奇妙です。 重量はますます大きくなっています。どこで間違えたの?

+0

は、あなたがあなたのパーセプトロンを訓練する方法を示しすることはできますか?あなたのトレーニングロジックを実行するコードを意味します。 – serhiyb

+0

各蓄積操作の後にtanhを適用しています。最初に蓄積する必要があります。その後にtanhを適用します。 – rayryeng

+0

@rayryengありがとうございました。 :) – phillyai

答えて

1

各ニューロンの出力を計算するコードでは、有効化関数を正しく適用していません。ウェイトと各ニューロンへの入力の間のドット積を見つける必要があります次には、後に活性化関数を適用します。各加重累積後に有効化関数を適用していますが、これは正しくありません。

蓄積させ、その後、活性化関数を適用します。

public double Compute(double[] input, bool quan) 
{ 
    double result = 0; 
    for (int i = 0; i < _layer; i++) 
     result += _weights[i] * input[i]; // Change - accumulate first 
    result = Math.Tanh(result); // Change - now apply activation function 

    return quan ? (result >= 0 ? 1 : 0) : result; 
} 
+1

私はlinqをより短いコードに使用しました。 'double result = Sigmoid.LogSigmoid(_weights.Zip(input、(a、b)=>(a * b))。Sum()+ _biasWeight); – phillyai

+0

それはより良い方法です。ありがとう!私はすぐに編集します。 – rayryeng

関連する問題