使用反向传播训练前馈神经网络

我在训练我的神经网络时遇到了一些困难。当我使用,比如说,10个训练集时,训练过程结束后,神经网络只对最后两个训练集进行了训练。我输入了与训练网络时相同的值,但除了最后两个结果外,其余结果都是错误的。似乎新输入的神经网络记忆压制了旧的记忆。我使用了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()//加载记忆    {        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()//获取训练输入和预期输出    {                    //调用处理方法         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)//使用反向传播训练神经网络    {        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()//此方法获取输入值并根据之前的训练给出输出    {        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()//重置记忆    {        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;            }    }}

回答:

我找到了问题的所在。我没有混合训练数组,而是一直将一个数组输入到神经网络中,直到它为该数组训练好,而不是以循环的方式引入所有数组。我希望这对某人有用。

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注