Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[c++] siec neuronowa, podstawy.

crn 15 Kwi 2012 15:19 4463 4
  • #1 15 Kwi 2012 15:19
    crn
    Poziom 8  

    Witam,
    pod delikatna presją studiów wziąłem się za napisanie sieci neuronowej. Poczytałm trochę, rozplanowałem projekt.
    Pierwsza rzeczą, za która się wziąłem jest klasa neuron. działa ona w następujący sposób:

    funkcja aktywacji: ** ( 2/(1+ exp( (-1*beta) * potencjal_membranowy) )-1 );**
    pochodna funkcji aktywacji: **( (1-(pow( potencjal_membranowy,2)))/2)**
    uaktualnianie wag: ** inputsWeights[i] = (inputsWeights[i] + ( learningRate * inputs[i] * (activationFunctionDerivative() ) ));**
    obliczanie błędu **ostatniej** warstwy: **( (ExpectValue - output) * activationFunctionDerivative() );**

    funkcja aktywacji uwzględnia bias.
    a sieć w założeniu ma być wielowarstwowa

    i tutaj zaczyna sie pierwszy problem. Stworzyciel obiekt neuron i próbuje go uczyć. Daje na wejście 0.5 na wyjcie -0.5, uczę go, a on nic :) Moje pytanie, czemu tak się dzieje? Może coś we wzorach pomieszałem?

    Pytanie 2: przegrzebałem setki storn i nie wiem do końca kiedy przestać uczyć siec, czy dowolny neuron. Moja funkcja bledu zwraca wartość ujemna jak sumować błędy? Dodatkowo, jeżeli mam parę wyjść, to sumuje błąd ze wszystkich tak?

    Serdecznie pozdrawiam
    i dziękuje za pomoc

    0 4
  • #2 15 Kwi 2012 15:34
    markonedj
    Poziom 22  

    Zagadnienie pisania własnych bibliotek SSN wymaga dość dużej wiedzy (doświadczenia) w tej dziedzinie, a po drugie jest czasochłonne i energożerne (pisałem na zaliczenie własną bibliotekę wykorzystującą algorytm genetyczny do aproksymacji funkcji dwóch zmiennych).

    Może spróbuj wpierw zastosować jakąś bibliotekę do tego ? Potem jak poznasz podstawy tworzenia takich sieci, zajrzyj w kod źródłowy biblioteki i staraj się napisać własne klasy.
    Niestety nie polecę Ci żadnych bibliotek do C++ bo pisałem w C# i Java.

    Pzdr

    0
  • #3 15 Kwi 2012 17:17
    crn
    Poziom 8  

    korzytalem z biblioteki FANN. Ogolnie rozumiem jak to dziala. Chce daltego zaczac od prsotej sieci wielowarstwowej z algorytmem wstecznej propagacji (szczegolnie, ze i tak musze do skozly taka napsiac).
    Znasz moze odpowiedzi na moje pytania i moglbys pomoc ?
    czy te wzory sa porpawne, jak wyliczyc blad dla calej sieci i czemu ten neuron moze sie nie uczyc?

    Pozdrawiam
    EDIT:
    po zmianach funkcja aktywacji wygląda tak:
    (2.0/((1.0+(exp(-beta*potencjał_membranowy)))-1.0));
    pochodna tak:
    ((1.0-(output*output))/2.0);
    poprawianie wag tak:
    inputsWeights[i] = (inputsWeights[i] + ( learningRate * error * inputs[i] * (activationFunctionDerivative() ) ));

    i teraz działa (neuron się uczy) ale tylko w przedziale 0-1 i współczynnik uczenia musi być większy niż coś ok 0.3, inaczej funkcja zwraca mi więcej niż 1.
    w teorii funkcja Funkcja sigmoidalna bipolarna powinna zwracać wartości (-1 do 1).

    Zna ktoś może odpowiedź i jest chętny do pomocy? będę wdzięczny :)

    0
  • #5 04 Maj 2012 18:07
    crn
    Poziom 8  

    daniel1302 napisał:
    Sorry, że odgrzebuje temat ale sam przeglądam te tematy i tutaj jest odpowiedź na twoje pytania
    http://www.k0pper.republika.pl/inne.htm

    Dobrze, ze pomagasz :)
    Korzystalem z tej strony, ale tam wlasnie jest bledna (dajaca gorsze wyniki) pochodna i na koncu nei jest jasne, ktorego sposobu oblicznia bledu uzyc. Ten z gradiendem dziala dobrze, ale tylko w przypadku 1 neurona - jak sie robia jzu 2 warsty, to spoob warstwa wyjscie - wejscie jest lepsze.

    Pozdrawiam i chetnie wyslucham kogos, kto nei spal(jak ja) na analizie :)

    0