Uczenie Maszynowe – Szablon aplikacji JavaFX + Spring Boot + DL4j

Uczenie Maszynowe – Szablon aplikacji JavaFX + Spring Boot + DL4j

Dziś chcę podzielić się z Tobą aplikacją, która pozwoli Ci na efektywne wejście w świat sztucznych sieci neuronowych. Zadaniem aplikacji będzie dostarczenie graficznego interfejsu użytkownika, oraz zorganizowanie kodu w sposób, który umożliwi skupienie się jedynie na zagadnieniach związanych tematem uczenia maszynowego. GUI wykonane zostanie w JavaFX w połączeniu ze Spring Boot, natomiast do uczenia maszynowego zaprzęgniemy bibliotekę do obliczeń rozproszonych przeznaczoną dla  języka Java, którą jest DL4J.

Agenda
  1. Czego dowiesz się z tego poradnika
  2. Konfiguracja projektu
  3. W jaki sposób korzystać z szablonu aplikacji
  4. Szablon aplikacji od środka
  5. Co dalej?

 

Źródła aplikacji

  • Szablon do pobrania: zip
  • Repozytorium: git clone https://gitlab.com/better-coding.com/templates/dl4j-javafx-spring-boot-gradle.git

 

1. Czego dowiesz się z tego poradnika

Uczenie maszynowe wcale nie jest koncepcją tak świeżą jak mogłoby się wydawać. Za jej początki można uznać lata pięćdziesiąte i sześćdziesiąte ubiegłego wieku. W uproszczeniu polega ona na wykorzystaniu w systemach komputerowych technik statystycznych, przy pomocy których uczą się one rozwiązywania zadań, bez potrzeby jawnego kodowania algorytmów. W przypadku sieci neuronowych, efekt ten uzyskuje się poprzez uwrażliwianie jej na bodźce, czyli cechy wejściowe, oczekując od niej konkretnej odpowiedzi. Nie powinien zatem dziwić fakt, że temat ten wymaga wiedzy z wielu dziedzin począwszy od statystyki, poprzez programowanie, aż do tematów związanych z przetwarzaniem dużej ilości danych tzw. BigData.

Aby uprościć nieco omawiane zagadnienie postanowiłem napisać szablon aplikacji, który zdejmie z Ciebie konieczność wymyślania własnego GUI i pozwoli na szybkie wykonywanie przeróżnych eksperymentów z sieciami neuronowymi.

Aplikacja zawiera pasek z przyciskami pozwalającymi odpowiednio wczytać oraz zapisać aktualny stan sieci neuronowej, wykonać trening oraz przetestować sieć na osobnym zestawie danych. Pozostałą cześć formatki można dowolnie wykorzystać, np. na wizualizację działania sieci, co pokażę w kolejnym poradniku.

 

Ponadto w szablonie umieściłem komponent pozwalający na uruchomienie serwera Deeplearning4j UI, przy pomocy którego będziesz mógł śledzić stan sieci oraz postęp uczenia.

 

2. Konfiguracja projektu

Szablon aplikacji oparłem na projekcie opisanym we wcześniejszym artykule, a mianowicie połączenie JavaFX oraz Spring Boot. Jeśli nie zapoznałeś się jeszcze z nim, to polecam to zrobić, ponieważ będzie Ci zdecydowanie łatwiej zrozumieć jak szablon działa od środka.

Bazując na wspomnianym projekcie dodałem do build.gradle konfigurację zależności do deeplearning4j.

 

Do projektu wprowadziłem również przełącznik dl4j_use_cuda, ponieważ prędzej czy później przejdziemy na wykonywanie obliczeń na platformie CUDA. O samej CUDA oraz jak z niej korzystać porozmawiamy dalszych częściach cyklu o uczeniu maszynowym.

 

3. W jaki sposób korzystać z szablonu aplikacji

W szablonie przewidziałem dwa punkty pozwalające na jego adaptację do przyszłych projektów. Pierwszym z nich jest formatka custom-learning-gui.fxml, służąca do implementacji specyficznej dla projektu części GUI. Drugim elementem jest bean CustomLearningGuiControllerImpl, pełniący zarówno rolę kontrolera dla wspomnianej formatki, jak również dostarczający brakujących implementacji metod. To w nim będziemy definiować przyszłe sieci, oraz implementować algorytmy przetwarzania danych i uczenia sieci.

W pliku application.properties znajdują się parametry dzięki którym możesz wpłynąć na zachowanie szablonu.

 

Wspomniany wcześniej serwer UI domyślnie uruchomiony jest na porcie 9000 . Zatem przy ustawionej fladze  use-ui=true, oraz wejściu na adres http://localhost:9000 powinieneś zobaczyć konsolę serwera UI. W kolejnym artykule opiszę dokładnie w jaki sposób zbudować aplikację opartą na omawianym tu szablonie.

 

4. Szablon aplikacji od środka

Szablon składa się z formatki głównej learning-gui.fxml zawierającej wspomniane wcześniej przyciski (Load, Save, Train oraz Test), która ma w sobie zagnieżdżoną formatkę  custom-learning-gui.fxml. Ta z kolei przeznaczona jest do implementacji przyszłej części GUI – nieznanej jeszcze i różnej dla każdej aplikacji.

 

Formatka wyposażona jest w kontroler LearningGuiController, który pozwolę sobie omówić bardziej szczegółowo, ponieważ w jego kodzie można znaleźć kilka przydatnych informacji. Omawiany kod możesz znaleźć w repozytorium.

Kontroler zawiera pola przypięte do wspomnianych wcześniej kontrolek – efekt ten uszykujemy poprzez adnotację @FXML oraz nazwanie pól jak wartość atrybutu  fx:id w pliku learning-gui.fxm.

Pole counterProperty służy za licznik przebiegów nauczania i jest spięty z etykietą counterText.

Klasa UIServerComponent jest komponentem zarządzającym stanem serwera UI. Interfejs CustomLearningGuiController oraz jego przeznaczenie omówiłem już wcześniej, a mianowicie służy on do oprogramowania zachowania docelowej aplikacji.

Metoda o nazwie initialize oznaczona adnotację @FXML, jest wykonywana tuż po przypięciu do kontrolera kontrolek oznaczonych adnotacją @FXML. Można o niej myśleć jako o konstruktorze w świecie JavaFX. Wykorzystałem ją do przygotowania inicjalnego stanu formatki.

W pierwszym kroku przygotowuję Timeline, który pozwoli na wykonanie dowolnego kodu odświeżającego GUI. Mam tu na myśli kosztowny proces, który wykonywany jest co pewien okres. Przykładem może wizualizacja wyników uczenia sieci neuronowej co kilka sekund. Następnie wołana jest metoda customLearningGuiController.onInitialize(), która pozwala zareagować na zdarzenie initlialize. Ostatnim krokiem jest wystartowanie serwera UI oraz uruchomianie odświeżania GUI.

 

Kolejną parą akcji, na które warto zwrócić uwagę, to wczytanie i zapis sieci neuronowej do pliku. Używam do tego celu klasy ModelSerializer.

 

Proces uczenia sieci neuronowej zrealizowany jest za pomocą poniższych metod. Pierwsza z nich odpowiada za zablokowanie lub odblokowanie odpowiednich przycisków oraz zainicjowanie procesu uczenia poprzez wywołanie Platform.runLater(this::trainLoop), co spowoduje uruchomienie metody  trainLoop w kolejnym cyklu JavaFX.

Metoda trainLoop zawiera logikę związaną  z obsługą zliczania liczby pętli uczenia oraz za wykonanie dostarczonego z zewnątrz kodu odpowiedzialnego za uczenia sieci. Jeśli przycisk treningu posostaje wciśnięty, to metoda zleca ponowne swoje wykonanie.

 

Warto również zajrzeć do pliku ImageUtils.java, w którym znajdziesz metody konwersji zakresu danych, jak również metody tworzące obrazy na bazie wyniku działania sieci neuronowej.

 

 5. Co dalej?

 

To byłoby na tyle jeśli chodzi o ten wpis. Jeśli podoba Ci się konwencja i chciałbyś więcej takich wpisów, zostaw mi komentarz z tematem, który Cię interesuje a ja postaram się go przygotować. Tymczasem możesz mi pomóc dotrzeć do większej liczby odbiorców udostępniając ten wpis.Dziękuję

 

1
Leave a Reply

avatar
1 Comment threads
0 Thread replies
0 Followers
 
Most reacted comment
Hottest comment thread
0 Comment authors
Recent comment authors
  Subscribe  
newest oldest most voted
Notify of
trackback

[…] Uczenie Maszynowe – Szablon aplikacji JavaFX + Spring Boot + DL4j […]

Close Menu