[c++] FANN Library 3583 6

O temacie

Autor Wonski

Zaczęty 21.11.2015 roku

Wyświetleń 3583

Odpowiedzi 6

Wonski

Wonski

Gry (themodders@telegram)
radio engineer
posty256
Propsy91
ProfesjaProgramista
  • Gry (themodders@telegram)
  • radio engineer

Wonski
Gry (themodders@telegram)

[c++] FANN Library
Witam,
Kilka dni temu zainteresowałem się sieciami neuronowymi. Trochę teorii i od razu przeszedłem do praktyki. Wybrałem bibliotekę FANN.

Uruchomiłem przykładowy program, uczący się funkcji XOR
Spoiler
Funkcja XOR czyli bramka logiczna oznaczająca alternatywę wykluczającą. Funkcja zwraca prawdę tylko wtedy gdy tylko jeden z dwóch wyrazów jest równy prawdzie.

Kod przykładowy znajdziecie na tej stronie:
http://leenissen.dk/fann/wp/help/getting-started/

Tak w skrócie:
pierwsza sekcja kodu jest odpowiedzialna za trening sieci
druga sekcja to materiały treningowe dla sieci (tabela prawdy dla funkcji XOR)
trzecia sekcja to wykorzystanie już nauczonej sieci z sekcji pierwszej do rozwiązywania problemów

Problem pojawia się właśnie w sekcji trzeciej, ponieważ zupełnie nie wiem jak mam interpretować wyniki jakie zwraca mi już nauczona sieć.
Przykładowo po jednym treningu sieci, funkcja fann_run
Spoiler
    FANN_EXTERNAL fann_type * FANN_API fann_run(struct fann *ann, fann_type *   input)
Will run input through the neural network, returning an array of outputs, the number of which being equal to the number of neurons in the output layer.
zwraca wartości 0.0000 dla dowolnych danych wejściowych (wybranych oczywiście z zbioru wartości funkcji XOR), by po ponownym treningu zwracać jakieś kosmiczne wartości typu 534536456.0000 dla dowolnych innych danych wejściowych.

Jest to przykładowy kod i nie mam pojęcia dlaczego takie cyrki się dzieją. Na wyjściu sieci powinny się znajdować wartości -1(fałsz) lub 1(prawda), ponieważ tylko takie wartości są określone jako wyjściowe w pliku treningowym.

Jeżeli ktoś zna tę bibliotekę to prosiłbym o pomoc. Nawet jeśli ktos w ogóle ma pomysł o co tu może chodzić.
Pozdrawiam.
 

mgr Fartuess

mgr Fartuess

Użytkownicy
Kiedyś to były czasy!
posty1485
Propsy890
ProfesjaProgramista
  • Użytkownicy
  • Kiedyś to były czasy!
Fajno :)


Ja jak miałem semestr z sieciami neuronowymi to napisałem toto od zera, ale co nerwów natraciłem...
 
Popisuje się ciągle menda jedna...

Wonski

Wonski

Gry (themodders@telegram)
radio engineer
posty256
Propsy91
ProfesjaProgramista
  • Gry (themodders@telegram)
  • radio engineer
No biblioteka sama w sobie jest bardzo fajna, wypadałoby tylko załapać podstawy a jako że, kiepsko u mnie z angielskim to muszę improwizować :D
 

Wonski

Wonski

Gry (themodders@telegram)
radio engineer
posty256
Propsy91
ProfesjaProgramista
  • Gry (themodders@telegram)
  • radio engineer

Wonski
Gry (themodders@telegram)

[c++] FANN Library
#3 2015-11-22, 23:02(Ostatnia zmiana: 2015-11-22, 23:27)
Jakby ktoś przez przypadek zaczął użytkować tą bibliotekę i przez przypadek miał takie same problemy tak jak ja :D to jest na to rozwiązanie:
wystarczy zamiast

#include "floatfann.h"

dać

#include "doublefann.h"

w ten sposób wreszcie uzyskamy poprawne lecz zbliżone dane wyjściowe.
Np:
input a=1 and a=-1 => 0.9564
input a=1 and a=1 => -0.9564

Sieć neuronowa wyprodukowała poprawne choć nie idealne wyniki.
Jeżeli chcemy uzyskać wyniki takie same jak we wzorcu to należy manipulować wartością błędu oczekiwanego tj.:

desired_error

Normalnie jest tak, że im wartość błędu oczekiwanego jest bliższa zeru tym wyniki są dokładniejsze.
tak więc, należy defaultowe

const float desired_error = (const float) 0.001;

zamienić na:

const double desired_error = (const double) 0;

Zmieniłem również typ danych, choć na typie float również wszystko działa bez zarzutu.
To tak dla estetyki.

Nwm dlaczego w sekcji getting started na ich oficjalnej stronie są takie krzaczki. Zasugerowałem im by to zmienili. Co z tym zrobią... średnio mnie to obchodzi, choć warto zauważyć, że nie tylko ja miałem takie problemy. To bardzo źle o nich świadczy, tym bardziej, że biblioteka ma być podobno łatwa w obsłudze.

No nic...
W miarę postępów w nauce zamierzam przygotować kilka tutoriali zarówno z teorii jaki w samej praktyki w fann. Motywacją jest kiepski dostęp do takich materiałów w języku polskim a jeśli już to są one mocno przestarzałe.
 

mgr Fartuess

mgr Fartuess

Użytkownicy
Kiedyś to były czasy!
posty1485
Propsy890
ProfesjaProgramista
  • Użytkownicy
  • Kiedyś to były czasy!
Jakby ktoś przez przypadek zaczął użytkować tą bibliotekę i przez przypadek miał takie same problemy tak jak ja :D to jest na to rozwiązanie:
wystarczy zamiast

#include "floatfann.h"

dać

#include "doublefann.h"

w ten sposób wreszcie uzyskamy poprawne lecz zbliżone dane wyjściowe.
Np:
input a=1 and a=-1 => 0.9564
input a=1 and a=1 => -0.9564
Jak przykład działa na floatach to nie ma co się czepiać. To jest i tak sieć złożona jedynie z 3 perceptronów, więc niższa precyzja nic nie popsuje.

Sieć neuronowa wyprodukowała poprawne choć nie idealne wyniki.
Jeżeli chcemy uzyskać wyniki takie same jak we wzorcu to należy manipulować wartością błędu oczekiwanego tj.:

desired_error

Normalnie jest tak, że im wartość błędu oczekiwanego jest bliższa zeru tym wyniki są dokładniejsze.
tak więc, należy defaultowe

const float desired_error = (const float) 0.001;

zamienić na:

const double desired_error = (const double) 0;
W przypadku uczenia maszynowego chyba nie da się mówić o "idealnych wynikach nauki". Ot sieć się nauczyła się zwracać prawidłowe wyniki dla danych zestawów wejść. W przypadku XORa akurat uczysz sieć dla wszystkich możliwych kombinacji wejść, więc nie ma znaczenia jakie masz wagi na wejściach do neuronów. A końcowy wynik i tak chyba powinien przejść przez klasyfikator binarny, bo XOR to funkcja logiczna zwracająca true/false. Tylko, że w praktyce sieci neuronowych używa się raczej do klasyfikowania/rozpoznawania rzeczy na tyle złożonych, że podejścia analityczne po prostu nie dają sobie rady. Tam budujesz sieć, uczysz ją na olbrzymim zestawie uczącym. Po ekstremalnie długim czasie nauki w końcu sieć poprawnie klasyfikuje większość przykładów uczących. Potem testujesz sieć i każesz nią sklasyfikować zestaw przykładów testowych. Sprawdzasz precission i recall i nagle się okazuje, że twoja sieć jednak dość chujowo działa :F

Jak ustawisz desired error na 0, to w niektórych sieciach może ci się ona nigdy nie nauczyć, albo uczyć się ekstremalnie długo.

Zmieniłem również typ danych, choć na typie float również wszystko działa bez zarzutu.
To tak dla estetyki.

Nwm dlaczego w sekcji getting started na ich oficjalnej stronie są takie krzaczki. Zasugerowałem im by to zmienili. Co z tym zrobią... średnio mnie to obchodzi, choć warto zauważyć, że nie tylko ja miałem takie problemy. To bardzo źle o nich świadczy, tym bardziej, że biblioteka ma być podobno łatwa w obsłudze.

No nic...
W miarę postępów w nauce zamierzam przygotować kilka tutoriali zarówno z teorii jaki w samej praktyki w fann. Motywacją jest kiepski dostęp do takich materiałów w języku polskim a jeśli już to są one mocno przestarzałe.

Moim zdaniem jak dla kogoś problemem jest nauczenie się angielskiego, to raczej nie powinien się zabierać za naukę sieci neuronowych :F
 
Popisuje się ciągle menda jedna...

Wonski

Wonski

Gry (themodders@telegram)
radio engineer
posty256
Propsy91
ProfesjaProgramista
  • Gry (themodders@telegram)
  • radio engineer

Wonski
Gry (themodders@telegram)

[c++] FANN Library
#5 2015-11-23, 15:12(Ostatnia zmiana: 2015-11-23, 16:32)
Dzięki za rady, zawsze to zdanie kogoś bardziej doświadczonego. Również gratki za sprostowanie tego co napisałem.

Cytuj
Moim zdaniem jak dla kogoś problemem jest nauczenie się angielskiego, to raczej nie powinien się zabierać za naukę sieci neuronowych
Nie wiem skąd wniosek, że mam jakiekolwiek problemy z nauką tego języka... Mimo wszystko dzięki za opinię :)
Osobiście uważam, że dobrym pomysłem jest jednoczesna nauka obu tych "przedmiotów".

Cytuj
Tylko, że w praktyce sieci neuronowych używa się raczej do klasyfikowania/rozpoznawania rzeczy na tyle złożonych, że podejścia analityczne po prostu nie dają sobie rady. Tam budujesz sieć, uczysz ją na olbrzymim zestawie uczącym.

Ja sobie zdaje z tego wszystkiego sprawę. Ale od czegoś trzeba zacząć, tak?
Jak zaczynałem naukę c++ to nie od razu od obiektowości tylko od podstaw.

Cytuj
. W przypadku XORa akurat uczysz sieć dla wszystkich możliwych kombinacji wejść, więc nie ma znaczenia jakie masz wagi na wejściach do neuronów. A końcowy wynik i tak chyba powinien przejść przez klasyfikator binarny, bo XOR to funkcja logiczna zwracająca true/false.

To ma być najprostszy przykład. Z tego co czytałem to właśnie XOR nadaje się do tego najlepiej.
Pozdrawiam,
 

mgr Fartuess

mgr Fartuess

Użytkownicy
Kiedyś to były czasy!
posty1485
Propsy890
ProfesjaProgramista
  • Użytkownicy
  • Kiedyś to były czasy!
Dzięki za rady, zawsze to zdanie kogoś bardziej doświadczonego. Również gratki za sprostowanie tego co napisałem.

Cytuj
Moim zdaniem jak dla kogoś problemem jest nauczenie się angielskiego, to raczej nie powinien się zabierać za naukę sieci neuronowych
Nie wiem skąd wniosek, że mam jakiekolwiek problemy z nauką tego języka... Mimo wszystko dzięki za opinię :)
Osobiście uważam, że dobrym pomysłem jest jednoczesna nauka obu tych "przedmiotów".
Wspomniałeś o tym, że mało jest tego typu materiałów w języku polskim. To jest norma w IT. Bez angielskiego się przepadnie, więc już od dawna wychodzę z założenia, że już nawet nie szukam materiałów po polsku, tylko wszystkiego się uczę z angielskich źródeł :).

Cytuj
Tylko, że w praktyce sieci neuronowych używa się raczej do klasyfikowania/rozpoznawania rzeczy na tyle złożonych, że podejścia analityczne po prostu nie dają sobie rady. Tam budujesz sieć, uczysz ją na olbrzymim zestawie uczącym.

Ja sobie zdaje z tego wszystkiego sprawę. Ale od czegoś trzeba zacząć, tak?
Jak zaczynałem naukę c++ to nie od razu od obiektowości tylko od podstaw.

Cytuj
. W przypadku XORa akurat uczysz sieć dla wszystkich możliwych kombinacji wejść, więc nie ma znaczenia jakie masz wagi na wejściach do neuronów. A końcowy wynik i tak chyba powinien przejść przez klasyfikator binarny, bo XOR to funkcja logiczna zwracająca true/false.

To ma być najprostszy przykład. Z tego co czytałem to właśnie XOR nadaje się do tego najlepiej.
Pozdrawiam,
Chodziło mi o coś innego - w bardziej skomplikowanych przykładach/praktycznych zastosowaniach może się po prostu nie dać zejść z błędem do absolutnego zera. Dlatego desired_error jest ustawiony na wartości niezerowe.
 
Popisuje się ciągle menda jedna...


0 użytkowników i 1 Gość przegląda ten wątek.
0 użytkowników
Do góry