【问题标题】:Training ff nn using backpropagation使用反向传播训练 ff nn
【发布时间】:2012-03-28 02:28:00
【问题描述】:

我在训练我的神经网络时遇到了一些困难。当我使用 10 个训练集时,在训练过程结束时,神经网络只针对最后两个进行训练。我输入的值与我用来训练网络的值相同,但我得到了错误的结果,除了最后两个。在我看来,新的 nn 记忆抑制了旧记忆。我使用了 64 个输入神经元,隐藏层中的 42 个神经元和一个输出神经元。 Sigmoid 函数用于激活神经元。训练输入和预期输出在 0 到 1 的范围内。有没有人知道可能导致问题的原因?

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

【问题讨论】:

  • 如果没有看到您的代码,就无法判断出了什么问题。请发布一个展示问题的最小示例。
  • 代码很粗糙,因为我在我的 mC 上使用了类似的 nn。我已将代码从 c 修改为 c#。它有很大的优化空间,但现在我只需要让它运行。
  • 一个训练集由特征向量 x_0, ..., x_n 和目标向量 y_0, ..., y_n 组成。您不能一个接一个地在多个训练集上训练一个正常的前馈神经网络。你必须制作一个训练集,否则 ANN 会忘记旧的训练集。这被称为“灾难性遗忘”。我没有阅读您的代码,但我认为您的意思是:“我有 a 训练集,包含 10 个 实例。对吗?
  • 这个想法是获得 64 个电压读数,将它们缩放以适应 0 到 1 的范围,然后执行 fft 以获得基频。因此学习数组将包含 64 个电压读数,第 65 个数组元素将是预期的频率值,该值也被缩放。这代表一个训练集。当我对其他一些读数执行 fft 时,我将生成另一个训练集。然后我使用第一个训练 nn 直到我得到一些小的错误值。之后我使用第二个训练集等等。我是这一切的初学者,我的学习过程中是否存在一些根本缺陷?你建议我应该怎么做?
  • 训练数组,训练集...也许我用错了术语,但我希望你能理解我的意思。

标签: c# machine-learning neural-network backpropagation


【解决方案1】:

我发现了问题所在。我没有混合训练数组,我将一个数组引入 nn 直到它被训练,而不是以循环方式引入所有数组。我希望这对某人有用。

【讨论】:

  • 是的,这是反向传播训练的一个关键问题。它被称为“灾难性遗忘”。您可以阅读有关该 e 的信息。 G。本文中:citeseerx.ist.psu.edu/viewdoc/…
猜你喜欢
  • 2011-01-09
  • 2017-07-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-20
  • 2012-02-19
  • 2016-06-03
  • 1970-01-01
相关资源
最近更新 更多