iRPROP +多层感知器

时间:2014-04-18 23:13:46

标签: neural-network propagation

大家好,这是我的MLP的iRPROP +算法代码。当我尝试训练我的网络时,标准偏差减少了1500个epoches(如此慢:从~0.5到0.4732)但突然开始增加。 谁能说我做错了什么?

 public void RPROP()
    {
        double a = 1.2, b = 0.5, nMax = 50, nMin = 0.000001;

        for (int l = Network.Length - 1; l > 0; l--)
        {
            for (int i = 0; i < Network[l].getSize(); i++)
            {
                Neuron n = Network[l].Neurons[i];
                double sum = 0;
                if (l == Network.Length - 1) n.Delta = (n.Output - DesiredOutput[i]) * ActFunc.calcDeprivateFunction(n.Output);
                else
                {
                    for (int k = 0; k < Network[l + 1].getSize(); k++)
                    {
                        sum += Network[l + 1].Neurons[k].getWeight(i) * Network[l + 1].Neurons[k].Delta;
                    }
                    n.Delta = sum * ActFunc.calcDeprivateFunction(n.Output);
                }

            }
        }
        for (int l = 1; l < Network.Length; l++)
        {
            for (int i = 0; i < Network[l].getSize(); i++)
            {
                Neuron n = Network[l].Neurons[i];
                if ((n.PrevDelta * n.Delta) > 0)
                {
                    n.N = Math.Min(a * n.PrevN, nMax);
                    n.Bias -= n.N * Math.Sign(n.Delta);
                    for (int j = 0; j < Network[l - 1].getSize(); j++)
                    {
                        n.setWeight(j, n.getWeight(j) - n.N * Math.Sign(n.Delta));
                    }
                    n.PrevDelta = n.Delta;
                }
                else if ((n.PrevDelta * n.Delta) < 0)
                {
                    n.N = Math.Max(b * n.PrevN, nMin);
                    if (this.CurrentError > this.LastError)
                    {
                        n.Bias += n.PrevN * Math.Sign(n.PrevDelta);
                        for (int j = 0; j < Network[l - 1].getSize(); j++)
                        {
                            n.setWeight(j, n.getWeight(j) + n.PrevN * Math.Sign(n.PrevDelta));
                        }
                    }
                    n.Delta = 0;

                }
                else if ((n.PrevDelta * n.Delta) == 0)
                {
                    n.Bias -= n.N * Math.Sign(n.Delta);
                    for (int j = 0; j < Network[l - 1].getSize(); j++)
                    {
                        n.setWeight(j, n.getWeight(j) - n.N * Math.Sign(n.Delta));
                    }
                    n.PrevDelta = n.Delta;
                }
                n.PrevN = n.N;
            }
        }
    }

1 个答案:

答案 0 :(得分:0)

对于第一个视图,您计算一个列车元素错误,然后立即将其传授给网络。尝试在完整的火车组上运行,不改变重量,只是总结三角洲。之后,更新权重一次,设置prev delta并重新开始 此外,神经元阈值没有更新。