NeuralNetwork обратный вопрос распространения - PullRequest
1 голос
/ 17 августа 2011

После прочтения кода нейронной сети многих других людей я убежден, что с моим кодом что-то не так.Это работает, и я могу обучить сеть, просто чтобы обучить следующий персептрон в скрытом слое, я должен обучить последний, разве я не смогу обучить все подразделения в скрытом слое параллельно?

Вот код, который вычисляет ошибку скрытого слоя:

    for(int i=n->numOfPerceptronLayers-2;i>=1;i--) { // for all hidden layers
        float sum = 0.0; // <- This here is the problem
        for(int j=0;j<n->perceptronLayers[i].numOfPerceptrons;j++) { // For all the units in the current hidden layer
            for(int k=0;k<n->perceptronLayers[i].perceptrons[j].numOfConnections;k++) { // Loop through the current units connections to the previous layer (output layer)
                sum += n->perceptronLayers[i+1].perceptrons[k].error * n->perceptronLayers[i+1].perceptrons[k].weights[j];
            }
            n->perceptronLayers[i].perceptrons[j].error = n->perceptronLayers[i].perceptrons[j].output * (1.0 - n->perceptronLayers[i].perceptrons[j].output) * sum;
        }
    }

Должно быть так (но это не работает):

for(int i=n->numOfPerceptronLayers-2;i>=1;i--) { // for all hidden layers 
    for(int j=0;j<n->perceptronLayers[i].numOfPerceptrons;j++) { // For all the units in the current hidden layer
        float sum = 0.0;
        for(int k=0;k<n->perceptronLayers[i].perceptrons[j].numOfConnections;k++) { // Loop through the current units connections to the previous layer (output layer)
                sum += n->perceptronLayers[i+1].perceptrons[k].error * n->perceptronLayers[i+1].perceptrons[k].weights[j];
        }
        n->perceptronLayers[i].perceptrons[j].error = n->perceptronLayers[i].perceptrons[j].output * (1.0 - n->perceptronLayers[i].perceptrons[j].output) * sum;
    }
}

Почемуэто что переменная суммы должна быть объявлена ​​для всего слоя, а не для одного персептрона?

Ответы [ 2 ]

0 голосов
/ 17 августа 2011

Кажется, я обнаружил проблему, в основном моя функция TrainPerceptron (Perceptron * p, ошибка с плавающей точкой, импульс с плавающей точкой), которая обучает один персептрон, получила ошибку перцептрона через аргумент, даже если структура Perceptron имела свойство error,Я передавал в функцию свойство error, но, думаю, что-то смешалось, потому что после того, как я удалил этот аргумент и просто использовал ошибку, сохраненную в структуре Perceptron, она сработала.

0 голосов
/ 17 августа 2011

Если я что-то упустил, я считаю, что сегмент кода first неверен, а последний сегмент корректен.

В первом сегменте кода использование одной переменной 'sum' для целого слоя приводит к накоплению ошибки при каждом последующем воздействии на персептрон.Таким образом, у персептрона j всегда будет больше ошибок, чем у персептрона j-1.

Последний код решает эту проблему, но вы говорите, что он не работает.Единственный обоснованный вывод заключается в том, что настоящая проблема заключается в другом месте вашего кода, поскольку первый сегмент кода не должен работать.

В стороне: вы действительно должны иметь возможность обучать все слоиперсептроны параллельны, поскольку каждый персептрон полагается только на свои прямые соединения для своей доли ошибки (в стандартном обратном распространении с прямой связью).

...