2015-03-08 2 views
0

Я пытаюсь сделать распознавание рукописного ввода одним слоем персептронов, используя базу данных MNIST на Java. Каждому персептрону назначается распознавание цифры (так 10 персептронов). Каждый из них обучается случайным образом на каждом из 50 000 образцов в течение нескольких эпох. При тестировании выбирается персептрон с наибольшей скоростью (т. Е. Тот, который наиболее уверен, что он правильный).Алгоритм обучения для сигмоида Неисправность Перцептрона - Распознавание рукописного текста

Используя этот метод, я постоянно получаю точность 93,5%. Тем не менее, я думаю, чтобы улучшить, мне нужно будет добавить скрытые слои и реализовать backpropogation. При использовании функции Sigmoid (squashing) для вычисления в прямом проходе моей однослойной сети она работает чудесно. Однако, когда я меняю свою функцию обратной передачи (обучения), чтобы соответствовать обратной связи, я получаю точность ~ 70%. Может ли кто-нибудь проверить мои алгоритмы, чтобы убедиться, что это правильно?

Я получил алгоритм из нескольких мест, и я думаю, что это то же самое. Например, этот: http://www.webpages.ttu.edu/dleverin/neural_network/neural_networks.html

Примечание. Я рассматриваю последний вес как предвзятость. «Ошибка», введенная в функцию обучения, - это только желаемый результат за вычетом фактического результата. Например, тот же массив, что и вход, - оттенки серого каждого пикселя в цифре.

Forward pass: 
public final double apply(double[] input) { 
    double ret = 0; 
    for (int i=0; i<wei.length-1; i++){ 
     ret = ret + input[i]*wei[i]; 
    } 
    ret+=wei[wei.length-1]; 

    //apply squashing function 
    ret = 1/(1+Math.exp(-ret)); 
    return ret; 
} 


Learning Function (backwards Pass) 
public final void learn(double error, double result, double[] example, double alpha) { 
    for (int i=0; i<wei.length-1; i++){ 
     //wei[i] = wei[i] + alpha*error*example[i]; //This was original learning function - it gives 93.5% accuracy 
     wei[i]=wei[i]+ alpha* error * example[i]*result*(1-result); //This line gives ~70% accuracy 
    } 
    //wei[wei.length-1] += alpha*error; //this line works for bias 
    wei[wei.length-1]=wei[wei.length-1]+ alpha* error * 1*result*(1-result); //again, this makes results inaccurate 

} 

ответ