0

こんにちは、私のMLP用のiRPROP+アルゴリズムのコードです。ネットワークをトレーニングしようとすると、標準偏差が 1500 エポック減少します (非常に遅い: ~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;
            }
        }
    }
4

1 に答える 1

0

最初のビューでは、1 つのトレイン エレメント エラーを計算し、それを即座にネットワークに教えます。重みを変更せずに、完全な列車セットを実行してみてください。デルタを要約するだけです。その後、重みを一度更新し、前のデルタを設定して最初からやり直します。
また、ニューロンのしきい値の更新はありません。

于 2014-09-03T08:59:37.890 に答える