Prosta sieć neuronowa nie uczy się

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

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.

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).

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

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