2012-03-11 12 views
2

自分のnnを訓練中にいくつかの問題が発生しました。私が使用すると、10のトレーニングセットを言うことができます、トレーニングの最後に神経回路網は最後の2つのためだけに訓練されています。私はネットワークを訓練するのに使ったのと同じ値を入力しています。最後の2つを保存しても間違った結果が出ています。新しいnnメモリは古いメモリを抑制するようです。私は64の入力ニューロン、隠れた層に42のニューロン、そして1つの出力ニューロンを使用しています。シグモイド関数は、ニューロンを活性化するために使用される。トレーニング入力と期待される出力は0〜1の範囲です。誰かが問題を引き起こしているかもしれない何か手がかりを持っていますか?バックプロパゲーションを使用したff nnのトレーニング

Neuron b = new Neuron(); 
    Fft f = new Fft(); 
    float e = 2.71828f; 
    float eta = 0.05f; 
    float alpha = 0.05f; 
    float[] saw = new float[42]; 
    float[] dh = new float[42]; 
    float error = 0; 
    float dto = 0; 
    Random broj = new Random(); 
    TextReader br = new StreamReader("d:/trening.txt"); 
    TextReader ir = new StreamReader("d:\\input.txt"); 


    float NextFloat(Random rng, float min, float max) 
    { 
     return (float)(min + (rng.NextDouble() * (max - min))); 
    } 

    public void load()//load memory 
    { 
     int i, j; 
     byte[] floatBytes; 
     BinaryReader br = new BinaryReader(File.Open("d:/memorija.txt", FileMode.Open)); 

     for (j = 0; j <= 41; j++) 
     { 
      for (i = 0; i <= 64; i++) 
      { 
       floatBytes = br.ReadBytes(4); 
       b.w12[i][j] = BitConverter.ToSingle(floatBytes, 0); 
      } 
     } 
     for (j = 0; j <= 1; j++) 
     { 
      for (i = 0; i <= 41; i++) 
      { 
       floatBytes = br.ReadBytes(4); 
       b.w23[i][j] = BitConverter.ToSingle(floatBytes, 0); 
      } 
     } 
     br.Close(); 
    } 


    public void trening()//Get training inputs and expected outputs 
    {     //Calls process methode 
     int i, n,ct=0; 
     using (TextReader tr = new StreamReader("d:/trening.txt")) 
     { 
      do 
      { 
       ct++; 
      } while (tr.ReadLine() != null); 
      tr.Close(); 
     } 

     for (n = 0; n < (ct-1)/65; n++) 
     { 
      for (i = 1; i <= 65; i++) 
       b.input[i] = Convert.ToSingle(br.ReadLine()); 

      process(b.input[65]); 
      target.Text = ((b.input[65]).ToString()); 
     } 

    } 
    public void process(double t)//Trains nn using backpropagation 
    { 
     error = 0; 
     do 
     { 
      int i, j, k; 
      BinaryWriter bw = new BinaryWriter(File.Open("d:\\memorija.txt", FileMode.Create)); 
      i = k = j = 0; 
      for (j = 1; j <= 41; j++) 
      { 
       b.ulaz2[j] = b.w12[0][j]; 
       for (i = 1; i <= 64; i++) 
       { 
        b.ulaz2[j] += b.input[i] * b.w12[i][j]; 
       } b.izlaz2[j] = (float)(1.0/(1.0 + Math.Pow(e, -b.ulaz2[j]))); 
       if (b.izlaz2[j] < 0) 
        MessageBox.Show(b.izlaz2[j].ToString()); 
      } 
      for (k = 1; k <= 1; k++) 
      { 
       b.ulaz3 = b.w23[0][k]; 
       for (j = 1; j <= 41; j++) 
       { 
        b.ulaz3 += b.izlaz2[j] * b.w23[j][k]; 
       } b.izlaz = (float)(1.0/(1.0 + Math.Pow(e, -b.ulaz3))); 

       error += (float)(0.5 * (t - b.izlaz) * (t - b.izlaz)); 
       dto = (float)(t - b.izlaz) * b.izlaz * (1 - b.izlaz); 
      } 

      for (j = 1; j <= 41; j++) 
      { 
       saw[j] = 0; 
       for (k = 1; k <= 1; k++) 
       { 
        saw[j] += dto * b.izlaz2[j]; 
       } dh[j] = saw[j] * b.izlaz2[j] * (1 - b.izlaz2[j]); 

      } 
      for (j = 1; j <= 41; j++) 
      { 
       b.w12d[0][j] = eta * dh[j] + alpha * b.w12d[0][j]; 
       b.w12[0][j] += b.w12d[0][j]; 
       for (i = 1; i <= 64; i++) 
       { 
        b.w12d[i][j] = eta * b.input[i] * dh[j] + alpha * b.w12d[i][j]; 
        b.w12[i][j] += b.w12d[i][j]; 
       } 
      } 
      for (k = 1; k <= 1; k++) 
      { 
       b.w23d[0][k] = eta * dto + alpha * b.w23d[0][k]; 
       b.w23[0][k] += b.w23d[0][k]; 
       for (j = 1; j <= 41; j++) 
       { 
        b.w23d[j][k] = eta * b.izlaz2[j] * dto + alpha * b.w23d[j][k]; 
        b.w23[j][k] += b.w23d[j][k]; 
       } 
      } 
      for (j = 0; j <= 41; j++) 
      { 
       for (i = 0; i <= 64; i++) 
        bw.Write(b.w12[i][j]); 
      } 

      for (j = 0; j <= 1; j++) 
      { 
       for (i = 0; i <= 41; i++) 
        bw.Write(b.w23[i][j]); 
      } 
      bw.Close(); 
      izlazb.Text = Convert.ToString(b.izlaz); 
      errorl.Text = Convert.ToString(Math.Abs(b.izlaz - b.input[64])); 
     } while (Math.Abs(b.izlaz - t) > 0.03); 
    } 

    public void test()//This methode gets input values and gives output based on previous training 
    { 
     int i = 0, j = 0, k = 0; 
     for (i = 1; i < 65; i++) 
      b.input[i] = (float)Convert.ToDouble(ir.ReadLine()); 

     for (j = 1; j <= 41; j++) 
     { 
      b.ulaz2[j] = b.w12[0][j]; 
      for (i = 1; i <= 64; i++) 
      { 
       b.ulaz2[j] += b.input[i] * b.w12[i][j]; 
      } b.izlaz2[j] = (float)(1.0/(1.0 + Math.Pow(e, -b.ulaz2[j]))); 
     } 
     for (k = 1; k <= 1; k++) 
     { 
      b.ulaz3 = b.w23[0][k]; 
      for (j = 1; j <= 41; j++) 
      { 
       b.ulaz3 += b.izlaz2[j] * b.w23[j][k]; 
      } b.izlaz = (float)(1.0/(1.0 + Math.Pow(e, -b.ulaz3))); 
     } izlazb.Text = Convert.ToString(b.izlaz); 
     target.Text = "/"; 
     errorl.Text = "/"; 
    } 

    public void reset()//Resets memory 
    { 
     BinaryWriter fw = new BinaryWriter(File.Open("d:\\memorija.txt", FileMode.Create)); 
     int i = 0; 
     int j = 0; 
     Random broj = new Random(); 
     for (j = 0; j <= 41; j++) 
     { 
      for (i = 0; i <= 64; i++) 
      { 
       b.w12[i][j] = 0; 
       b.w12[i][j] = 2 * (NextFloat(broj, -0.5f, 0.5f)); 
       fw.Write(b.w12[i][j]); 
      } 
     } 
     for (j = 0; j <= 1; j++) 
     { 
      for (i = 0; i <= 41; i++) 
      { 
       b.w23[i][j] = 0; 
       b.w23[i][j] = 2 * (NextFloat(broj, -0.5f, 0.5f)); 
       fw.Write(b.w23[i][j]); 
      } 
     } 
     fw.Close(); 
    } 

} 

}

ニューロンクラス

public class Neuron 
{ 
    public float[][] w12 = new float[65][];//(65, 42); 
    public float[][] w12d = new float[65][];//(65, 42); 
    public float[][] w23 = new float[42][];//(42,2); 
    public float[][] w23d = new float[42][];//(42, 2); 
    public float[] ulaz2 = new float[42]; 
    public float[] izlaz2 = new float[42]; 
    public float ulaz3; 
    public float[] input =new float[66]; 
    public static float[] ioutput; 
    public float izlaz; 
    public void arrayInit() 
    { 
     int i, j; 
     for (i = 0; i <=64; i++) 
     { 
      w12[i] = new float[42]; 
      w12d[i] = new float[42]; 
     } 

     for (i = 0; i <42; i++) 
     { 
      w23[i] = new float[2]; 
      w23d[i] = new float[2]; 
     } 
     for (j = 0; j < 42; j++) 
      for (i = 0; i <=64; i++) 
      { 
       w12[i][j] = 0; 
       w12d[i][j] = 0; 
      } 
     for (j = 0; j < 2; j++) 
      for (i = 0; i < 42; i++) 
      { 
       w23[i][j] = 0; 
       w23d[i][j] = 0; 
      } 
    } 
} 
+0

コードが表示されずに何がうまくいかなかったかはわかりません。問題を紹介する** minimal **の例を投稿してください。 –

+0

私のmCにも同様のnnを使用しているので、コードは粗末です。私はcからc#にコードを変更しました。それは最適化のための余地がありますが、今私はそれを稼働させる必要があります。 –

+0

トレーニングセットは、特徴ベクトルx_0、...、x_nおよびターゲットベクトルy_0、...、y_nからなる。通常のフィードフォワードニューラルネットワークは、複数のトレーニングセットで順番に訓練することはできません。あなたは1つの訓練セットを作らなければなりません。さもなければANNは古い訓練セットを忘れるでしょう。これは「壊滅的な忘却」として知られています。私はあなたのコードを読んでいませんでしたが、私はあなたが意味することを考えています: "私は** ** **トレーニングは10 **インスタンス**で設定されています**それは正しいですか? – alfa

答えて

2

私は、問題が何であったかが分かりました。私はトレーニング配列を混在させませんでした。すべての配列を循環的に導入するのではなく、訓練されるまでnnに1つの配列を導入しました。私はこれが誰かにとって有益であることを願っています。

+0

はい、バックプロパゲーショントレーニングの重大な問題です。 「cat」と呼ばれる天を忘れる "。あなたはそれについて読むことができます。 g。このペーパーでは、http://citeseerx.ist.psu.edu/viewdoc/download;jsessionid=DE0DFF02FCC641DA783DB32F76B60676?doi=10.1.1.36.3676&rep=rep1&type=pdf – alfa

関連する問題