sieci neuronowe cd. - rozpoznawanie litery A

0

http://4programmers.net/Forum/viewtopic.php?id=92909
Przed napisaniem tamtego postu wyniki szukania po 4programers bylo 0 stron :]
Teraz dziwnym trafem pokazuje wyniki, ale....

Z tego co czytalem w znalezionych postach, jednak dosc duzo osob ma pojecie o tym (osoba ktora, usunela tamten temat raczej tez :D), wiec moze mi ktos odpowie??

Nie wiem czemu mod uznal temat za nadajacy sie do kosza, jesli jest juz gdzies odpowiedz na forum, prosze o linka, bo jakos nie moglem znalezc :/
(do rozpoznawania mowy, calego alfabetu, OCRa, etc, tak, ale do prostej sieci, rozpoznajacej TYLKO czy to litera A czy nie, jakos nie znalazlem)

Tak wiec prosze o pomoc (przyklad, stronki z przykladem, czy nawet krotki kod czy nakierowanie jak to zrobic)

0

wątku nie wywaliłem ja, ale mogę Ci powiedzieć dlaczego wyleciał: temat jest cokolwiek nic nie mówiący. popraw go.

co do samego posta: najpierw zapoznaj się z pojęciem neuronu i sieci neuronowej. jak już będziesz mniej-więcej wiedział o co chodzi, to robisz tak:
wejścia do sieci neuronowej - 6x6, czyli 36. sieć jest dwuwarstwowa, kilka-kilkanaście neuronów (najlepiej tyle, ile pikseli ma literka A) w pierwszej warstwie z sigmoidalną funkcją aktywacji, jeden w warstwie wyjściowej z liniową funkcją aktywacji.
sieć taką uczysz. nauka (w wersji z nauczycielem) polega na podawaniu pewnych danych (wartości wejść neuronów pierwszej warstwy) i poprawnej odpowiedzi, i zmienianiu wag wejść neuronów w taki sposób, żeby znaleźć minimum błędu (różnica pomiędzy wartością oczekiwaną od sieci - czyli poprawną - a wartością która jest zwracana przez sieć). Pokazujesz sieci kilkaset (lub więcej) obrazków, przy czym część z nich zawiera różne litery A (przesunięte, przekręcone), i dla tych obrazków wymagasz, aby sieć zwróciła np. wartość 1, a dla pozostałych 0. Oczywiście sieć nigdy nie zwraca idealnego wyniku, więc zakładasz, że jeśli sieć zwróciła > 0,5 to jest to A. Koniec filozofii.

W praktyce w zasadzie jedyny problem to efektywne znajdowanie odpowiednich wartości wag w funkcji błędu sieci (chodzi o to, żeby znaleźć taką wagę neuronu, dla którego błąd wyniesie jak najmniej). Problemem jest to, że bardzo trudno jest znaleźć położenie globalnego minimum funkcji (tu funkcji błędu). Istnieje do tego kilka algorytmów (niekoniecznie bezpośrednio szukających minimum), np.: wstecznej propagacji gradientu (GD), gradientu sprzężonego (CGB, CGF), quasi-Newtona (BFGS), Levenberga-Marquardta (LM) itp.
Proces "dostrajania" wag powtarza się wiele razy dla wszystkich neuronów i różnych obrazków, aż w końcu wagi przestają się zmieniać, lub osiąga się żądany poziom błędu (błednych klasyfikacji lub błędu aproksymacji). Nie można przesadzić z długościa nauki, bo sieć zamiast uczyć się i generalizować po prostu zapamięta dane, i dla nieznanych będzie robić głupoty, nie można też jej uczyć zbyt krótko, bo co prawda będzie dobrze generalizować (radzić sobie z nieznanymi danymi), ale i tak będzie się często mylić. Trzeba znaleźć kompromis, istnieją pewne wskaźniki pozwalające tego dokonać, ale trochę za dużo pisania by było.

Swojego czasu usiłowałem zaimplementować wielowarstwową sieć neuronową w Delphi, ale poległem na szukaniu globalnego minimum. Muszę powiedzieć, że dużo szukałem w necie kodów źródłowych sieci neuronowych napisanych w Delphi, i nie znalazłem nic interesujacego, więc masz lekki problem. Poza tym dopóki nie załapiesz jak działa sieć, nie masz szans jej zaimplementować. Do nauki polecam funkcje zaimplementowane w Matlabie (konkretnie Neural Network Toolbox).

Acha - pewnie będziesz mieć dalsze pytania. Nie odpowiem na nie, jeśli będą to pytania o ewidentne podstawy.

0
ŁF napisał(a)

wątku nie wywaliłem ja, ale mogę Ci powiedzieć dlaczego wyleciał: temat jest cokolwiek nic nie mówiący. popraw go.
Hmmm, teraz lepszy?? :>

ŁF napisał(a)

sieć jest dwuwarstwowa
Czyli proponujesz bez warstwy ukrytej??
Wlasnie cos tam napisalem, ale zawsza znalazlem (np 4 pixele) rozwiazanie ktore w zaden sposob nie przypomina A, a przeszlo pozytywnie [glowa]
Wiekszosc kodow co znalazlem operowala na 3 warstwach (wejsciowa, jedna ukryta, wyjsciowa), ale wlasnie one realizowaly szykanie wszystkich liter

ŁF napisał(a)

sieć taką uczysz[...]Do nauki polecam funkcje zaimplementowane w Matlabie
Cenna uwaga, thx, bo w rzeczywistosci program nie musi miec zaimplementowanego "modulu" uczacego, wiec pocwicze z tym ;)

ŁF napisał(a)

Poza tym dopóki nie załapiesz jak działa sieć, nie masz szans jej zaimplementować.

Cos tam lapie, ale szczerze przyznam ze niezbyt uwazalem na wykladach (o ile na nich bylem ;] )

ŁF napisał(a)

Acha - pewnie będziesz mieć dalsze pytania. Nie odpowiem na nie, jeśli będą to pytania o ewidentne podstawy.
oki, na razie tylko pytanie czy na pewno siec bez warsty ukrytej wystarczy??

0

tak, wystarczy (btw wartwa wejściowa to właśnie warstwa ukryta; ukryta dlatego, że nie masz bezpośredniego dostępu do jej wyjść). dawno temu, kiedy jeszcze sieci neuronowe raczkowały, zrobiono prezentację na perceptronach, na jednej jedynej warstwie, i sieć ta rozpoznawała litery (aczkolwiek nie we wszystkich konfiguracjach).

co do Matlaba - jeśli nie musisz implementować uczenia, to robi się z tego banał. wystarczy, że zaimplementujesz w programie taki sam model sieci, jak w Matlabie, i przepiszesz wszystkie wagi sieci ;]

0

Polecam rozdział "Neural Networks (and more!)" w: The Scientist and Engineer's Guide to Digital Signal Processing by Steven W. Smith

0
ŁF napisał(a)

wystarczy, że zaimplementujesz w programie taki sam model sieci, jak w Matlabie
hmmm, tylko wlasnie jak w tym Matlabie to zrobic, bo od jakiegos czasu staram sie zrozumiec jak stworzyc w nim ta moja siec i jak ja pozniej nauczyc, ale jakos mi to nie wychodzi [glowa]
O co chodzi z tymi wektorami wejscia, czemu wlasnie to nie sa wektory, tylko macierze?? :/

(moglbym prosic o jakis przykladzik?? lub taka siec, co bym mogl zaimportowac do Matlaba i zobaczyc jak to worka?? [???] )

0

Przeszkadza, że u Ciebie wejście to macierz, a w sieci jest wektor. Sieć nie korzysta z tego, że jakiś pixel jest na lewo, na prawo czy u góry.
Macierz[i, j] == wektor[i*N+j] (N ? ?szerokość? tablicy).
W pamięci, tablica od dowolnej liczbie wymiarów przechowywana jest jako wektor.

const
    n=2;
type
    xx=byte;
    matrix = record
        case boolean of
            true:  (macierz: array [0..n-1, 0..n-1] of XX);
            false: (wektor : array [0..      n*n-1] of XX);
    end;
var
    q:matrix; 
begin
    // zobaczymy trzy takie same wiersze ?4?
    writeln(sizeof(q));
    writeln(sizeof(q.macierz));
    writeln(sizeof(q.wektor));
    //dwa sposoby dostępu do tego samego elementu
    q.wektor[1*n+2]:=255;
    q.macierz[1,2]:=5;
    writeln(q.wektor[1*n+2]);
end.

Rozmiar rekordu z wariantami (unia w języku C) to rozmiar największego wariantu.
W linku, który podałem wcześniej znajdziesz bardzo prosty opis neuronu i sieci, jednego ze sposobów uczenia, program w BASICu.

0

Xitami, nie chodzilo mi w Delphi/pascalu, ale w Matlabie :P
Bo ta reprezentacje sieci w Delphi zrobie, ale chodzi mi jak zrobic siec w Matlabie zeby ja nauczyc i pobrac pozniej odpowiednie wagi (zeby umiescic je u siebie w programie)

0

no to nie możesz nauczyć jej u siebie w programie? jakby co to tu masz kod sieci uczącej się i rozpoznającej cały alfabet (tyle że w C++ Builderze): kod
Litera ma rozmiar 5x7.

1 użytkowników online, w tym zalogowanych: 0, gości: 1