Prosta sieć neuronowa nie uczy się

Prosta sieć neuronowa nie uczy się
A2
  • Rejestracja:prawie 3 lata
  • Ostatnio:prawie 3 lata
  • Postów:3
0

Dzień dobry wszystkim.
Próbuję zaimplementować prostą sieć neuronową, która wykonuje trywialne działanie - mnożenie liczb zmiennoprzecinkowych na jakimś zakresie. Temat taki, a nie inny, bo sobie wybrałem jako projekt na studia. Sieć się tworzy raczej prawidłowo, ale nie zachodzi uczenie się. Ślęczę nad kodem już z ~15h i nie poczyniłem żadnych postępów... Korzystam z tablic, bo użycie <vector> jest wbrew regulaminowi przedmiotu. Parametry sieci są wczytywane z pliku, który jest w folderze debug. Liczba wejść wynosi jeden, bo próbowałem uprościć przypadek, żeby łatwiej wychwycić błędy (liczba na wejściu nie powinna się różnić od liczby na wyjściu). Jestem świadomy, że nie usuwam wszystkich obiektów dynamicznych, chciałem to zrobić na sam koniec. Jest nieco komentarzy, bo będę musiał wykonać dokumentację przy użyciu Doxygen, więc większych problemów ze zrozumieniem zamysłu autora nie powinno być. W załączniku przesyłam projekt. Środowisko pracy: Qt Creator.
Proszę bardzo pomoc, bo czuję się bezsilny. Z góry dziękuję wszystkim, którzy poświęcą swój czas!

Źródło z którego korzystałem do zaimplementowania sieci:
https://edu.pjwstk.edu.pl/wyklady/nai/scb/rW3.htm

CH
czysta AI, jak w zyciu, jeden chodzi do szkoly inny wagaruje :) czyli wszystko sie zgadza
A2
  • Rejestracja:prawie 3 lata
  • Ostatnio:prawie 3 lata
  • Postów:3
0

Dla sieci o jednej ukrytej warstwie i jednym wejściu dobrze obliczaja się suma ważona, wartość funkcji, jej pochodna, współczynnik błędu i zmiana wag. Sprawdzone na piechotę w Excelu.

Patryk27
Moderator
  • Rejestracja:prawie 18 lat
  • Ostatnio:prawie 2 lata
  • Lokalizacja:Wrocław
  • Postów:13042
1

Nie przyglądałem się szczególnie kodowi źródłowemu, ale mnożenie liczb z wykorzystaniem klasycznej FFNN wcale nie brzmi na prosty temat - pamiętaj, że FFNN służą do klasyfikacji danych, a nie wykonywaniu na nich operacji :-P

Jeśli Twoja sieć potrafi się nauczyć XORa, a pada na liczbach, to znaczy, że potrzebujesz znormalizować dane - np. wykorzystać fakt, że mnożenie można zareprezentować za pomocą sumy logarytmów (a = b * c <-> ln(a) = ln(b) + ln(c)), a taka suma powinna być w stanie dać się łatwo wyliczyć; przy czym wykorzystywanie do czegoś takiego sieci neuronowej zupełnie mija się z celem, bo by otrzymać wynik wystarczy zsumować wejścia, nie wymaga to wiele nauki 🙃

tl;dr na Twoim miejscu porzuciłbym pomysł mnożenia i pobawił się raczej w klasyfikację (np. http://yann.lecun.com/exdb/mnist/, klasyka).


edytowany 1x, ostatnio: Patryk27
A2
  • Rejestracja:prawie 3 lata
  • Ostatnio:prawie 3 lata
  • Postów:3
0
Patryk27 napisał(a):

Nie przyglądałem się szczególnie kodowi źródłowemu, ale mnożenie liczb z wykorzystaniem klasycznej FFNN wcale nie brzmi na prosty temat - pamiętaj, że FFNN służą do klasyfikacji danych, a nie wykonywaniu na nich operacji :-P

Jeśli Twoja sieć potrafi się nauczyć XORa, a pada na liczbach, to znaczy, że potrzebujesz znormalizować dane - np. wykorzystać fakt, że mnożenie można zareprezentować za pomocą sumy logarytmów (a = b * c <-> ln(a) = ln(b) + ln(c)), a taka suma powinna być w stanie dać się łatwo wyliczyć; przy czym wykorzystywanie do czegoś takiego sieci neuronowej zupełnie mija się z celem, bo by otrzymać wynik wystarczy zsumować wejścia, nie wymaga to wiele nauki 🙃

tl;dr na Twoim miejscu porzuciłbym pomysł mnożenia i pobawił się raczej w klasyfikację (np. http://yann.lecun.com/exdb/mnist/, klasyka).

Dzięki za odpowiedź. Ostatecznie pewnie tak zrobię, bo brakuje mi czasu. Jeśli znasz pythona, to może jesteś w stanie powiedzieć, co gość zrobił w tym kodzie, że u niego tego typu sieć działa?
https://gist.github.com/palashahuja/369c3b31d479f9fde2c7d11caec8bcf4

Patryk27
Niestety nie potrafię zrozumieć, jak ten kod działa - strzelam, że być może skaluje liczby (np. dzieląc je przez 10^n na wejściu i mnożąc na wyjściu).
A2
Czyli sprowadza temat do liczb z przedziału <-1, 1>, oczywiście tylko dla tych o mniejszym rzędzie wielkości. Dzięki jeszcze raz za wkład!

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.