Witam , napisałem program do rozpoznawanie liter w javie zgodnie z podpowiedziami jakie znalazłem w Internecie. Wygląda on mniej więcej tak:
Są 3 warstwy:
1: 35 neuronów z których każdy reprezentuje 1 piksel "matrycy". ( jest to plansza 5x7 na której znajduje się konkretna litera)
2:(ukryta) 10 neuronów ;
3: wyjściowa 26 neuronów z których każdy reprezentuje konkretną literę.
I program wygląda następująco:
Losuję wagi dla każdego neuronu
Uzupełniam wektory uczące - które służą do uczeni a sieci ( np. dla litera A wektor wygląda: 1 0 0 0 .... (25 zer) dla B (0 1 0 0 .....0) itd.
{
-następnie wczytuję pierwszy obrazek na którym jest litera A i zamieniam go na binarke
- wypełniam 1 warstwę tą binarką
- .... Potem poprzez odpowiednie sumy iloczynów i funkcję uzupełniam kolejne neurony w kolejnych warstwach
- sprawdzam co powinno być na wyjściu a co jest ( porównuję z wektorem uczącym
-obliczam błąd i uwzględniając ten bład modyfikuję wagi
} to wszystko w pętli dopóki błąd nie będzie mniejszy od 0.01
i w tym momencie mam nauczoną sieć dla litery A
powtarzam te instrukcje dla kolejnych liter
Mój problem polega na tym że jak nauczę sieć ( na razie uczyłem dla liter A-E) to po wczytaniu dowolnej litery zawsze pokazuje że jest to E ( czyli ostatnia litera nauczona) . Samo uczenie na pewno działa dobrze. Ale mam wątpliwości czegoś mi nie brakuje.
Ogólnie wygląda to tak:
while(błąd>0.01)
uczę litere A
Jeżeli nauczona robię to z kolejnymi
Następnie Proces uczenia od A-E powtarzam na razie dałem w pętli 100 razy ( bo mi stos przepełniało) ale nie zmienia to faktu że nawet po setnym razie wyniki całkowicie nie są zbliżone do tych jakie powinny być i pokazuje że w 99% jest to litera E ( przy dowolnie wczytanej ).