簡體   English   中英

神經網絡反向傳播無法正常工作

[英]Neural Net backpropagation doesn't work properly

最近,我已經實現了自己的神經網絡(使用不同的指南,但主要是從此處開始 ),以備將來使用(我打算將其用於我開發的OCR程序)。 目前,我正在測試它,並且遇到了這個奇怪的問題。

每當我給網絡提供訓練示例時,算法都會以產生所需輸出的方式更改權重。 但是,經過幾個訓練示例后,權重變得一團糟-使網絡對於某些輸出正常工作,而對其他輸出卻出錯(即使我完全按照原樣輸入了訓練示例的輸入)。

如果有人指示我解決問題,我將不勝感激。 以下是計算神經元誤差和調整體重的方法-

    private static void UpdateOutputLayerDelta(NeuralNetwork Network, List<double> ExpectedOutputs)
    {
        for (int i = 0; i < Network.OutputLayer.Neurons.Count; i++)
        {
            double NeuronOutput = Network.OutputLayer.Neurons[i].Output;
            Network.OutputLayer.Neurons[i].ErrorFactor = ExpectedOutputs[i]-NeuronOutput; //calculating the error factor
            Network.OutputLayer.Neurons[i].Delta = NeuronOutput * (1 - NeuronOutput) * Network.OutputLayer.Neurons[i].ErrorFactor; //calculating the neuron's delta
        }
    }

    //step 3 method
    private static void UpdateNetworkDelta(NeuralNetwork Network)
    {
        NeuronLayer UpperLayer = Network.OutputLayer;
        for (int i = Network.HiddenLayers.Count - 1; i >= 0; i--)
        {
            foreach (Neuron LowerLayerNeuron in Network.HiddenLayers[i].Neurons)
            {
                for (int j = 0; j < UpperLayer.Neurons.Count; j++)
                {
                    Neuron UpperLayerNeuron = UpperLayer.Neurons[j];
                    LowerLayerNeuron.ErrorFactor += UpperLayerNeuron.Delta * UpperLayerNeuron.Weights[j + 1]/*+1 because of bias*/;
                }
                LowerLayerNeuron.Delta = LowerLayerNeuron.Output * (1 - LowerLayerNeuron.Output) * LowerLayerNeuron.ErrorFactor;
            }
            UpperLayer = Network.HiddenLayers[i];
        }
    }

    //step 4 method
    private static void AdjustWeights(NeuralNetwork Network, List<double> NetworkInputs)
    {
        //Adjusting the weights of the hidden layers
        List<double> LowerLayerOutputs = new List<double>(NetworkInputs);
        for (int i = 0; i < Network.HiddenLayers.Count; i++)
        {
            foreach (Neuron UpperLayerNeuron in Network.HiddenLayers[i].Neurons)
            {
                UpperLayerNeuron.Weights[0] += -LearningRate * UpperLayerNeuron.Delta;
                for (int j = 1; j < UpperLayerNeuron.Weights.Count; j++)
                    UpperLayerNeuron.Weights[j] += -LearningRate * UpperLayerNeuron.Delta * LowerLayerOutputs[j - 1] /*-1 because of bias*/;
            }
            LowerLayerOutputs = Network.HiddenLayers[i].GetLayerOutputs();
        }

        //Adjusting the weight of the output layer
        foreach (Neuron OutputNeuron in Network.OutputLayer.Neurons)
        {
            OutputNeuron.Weights[0] += -LearningRate * OutputNeuron.Delta * 1; //updating the bias - TODO: change this if the bias is also changed throughout the program
            for (int j = 1; j < OutputNeuron.Weights.Count; j++)
                OutputNeuron.Weights[j] += -LearningRate * OutputNeuron.Delta * LowerLayerOutputs[j - 1];
        }
    }

學習速率為0.5,神經元的激活功能為S型功能。

編輯:我注意到我從未實現過用於計算總體誤差的函數:E = 0.5 *每個訓練示例的Sum(ty)。 可能是問題所在嗎? 如果是這樣,我應該如何解決?

學習率0.5似乎太大了。 通常使用接近0.010.1值。 同樣,如果訓練模式以隨機順序出現,通常也有助於收斂。 在此處可以找到更多有用的提示: 神經網絡常見問題解答(comp.ai.neural存檔)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM