Skip to content

Standard implemetation of a multi-layer percepton, written in python

Notifications You must be signed in to change notification settings

pskiers/Neural_Network

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

16 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Jakub Ostrzołek, Paweł Skierś
WSI ćwiczenie 5 - sieci neuronowe

Opis ćwiczenia

Celem ćwiczenia było zaimplementowanie sieci neuronowych.

Klasa implementująca warstę sieci przyjmuje następujące parametry konstruktora:

  • input_size - wymiar wektora wejściowego
  • output_size - wymiar wektora wyjściowego
  • activation - funkcja aktywacji
  • activation_grad - gradient funkcji aktywacji
  • output_inicialization - czy inicjalizować wagi zerami (w przeciwnym wypadku inicjalizuje losowo zgodnie z optymalnym rozkładem), powinien być ustawiony na True w ostatniej warstwie

Klasa implementująca sieć przyjmuje następujące parametry konstruktora:

  • is_classifier - jeżeli sieć jest klasyfikatorem, to dla każdej epoki jest obliczana również dokładność przewidywania.
  • layers... - warstwy sieci (można dodać również do istniejącej sieci za pomocą metody add_layer)

Sieć posiada funkcje fit i predict, służące odpowiednio do trenowania i przewidywania, działające zgodnie z modelami z biblioteki sklearn.

Wykorzystane zewnętrzne biblioteki

  • numpy
  • pandas
  • matplotlib
  • sklearn

Testowanie sieci

Aby przetestowyać sieć należy wykonać skrypt main.py, uprzednio zmieniając jej parametry zgodnie z zapotrzebowaniem. Skrypt wygeneruje nową sieć, wytrenuje ją na podstawie danych ze zbioru minist, oraz pokaże wykresy przedstawiające historię trenowania sieci oraz jej osiągi w postaci metryk i macierzy konfuzji.

Wykresy i wnioski

Batch size

batch size historia metryki
8 wykres wykres
32 wykres wykres
128 wykres wykres
512 wykres wykres
  • im większy batch size, tym szybciej wykonują się epoki (jedna operacja na macierzy jest szybsza niż wiele operacji na jej wierszach, np. dzięki temu, że może zostać użyta jednostka wektorowa; kod z bibliotek może być już skompilowany; wielokrotne wywoływanie funkcji na każdym wierszu jest wolne)
  • im mniejszy batch size, tym większa skłonność modelu do przetrenowania (dla większych wartości tego parametru gradient wag jest średnią gradientów wag z większej próby, co lepiej przybliża zbiór walidacyjny / testowy)
  • większy batch size poprawia osiągi na zbiorze testowym, ale zbyt duży powoduje spowolnienie uczenia się i pogorsza osiągi.

Learning rate

learning rate historia metryki
0.005 wykres wykres
0.01 wykres wykres
0.05 wykres wykres
0.1 wykres wykres
  • zbyt mały learning rate powoduje, że model się wolniej uczy (wolna eksploracja, duża eksploatacja)
  • zbyt duży learning rate powoduje bardziej nieregularne wyniki w uczeniu się modelu, więc trudniej mu znaleźć optimum (szybka eksploracja, mała eksploatacja)
  • przekroczenie pewnego progu parametru learning rate powoduje, że model może rozbiegać od rozwiązania

Overfitting

rozmiary ukrytych warstw historia metryki
512,256,128,64, batch 1 wykres wykres
1024,512,256,128, batch 128 wykres wykres
  • jeśli sieć jest dostatecznie duża i jest trenowana przez dostatecznie dużo epok to dochodzi do przetrenowania tzn. pomimo tego, że osiągi sieci na danych treningowych poprawiają się to jej osiągi na daych testowych są coraz gorsze.
  • sieć zaczyna przetrenowywać szybciej dla większych sieci.
  • przetrenowaniu można zapobiegać dodając do sieci warstwy typu drop out, dodając kary za duże wagi w neuronach, zmniejszając rozmiar sieci, oraz przez wykorzystanie walidacji krzyżowej.
  • prawdopodobnym powodem niewielkiego przetrenowania w przypadku naszej sieci jest duży rozmiar zbiorów treningowego, walidacyjnego i testowego przy stosunkowo niedużym zróżnicowaniu elementów tego zbioru.

Underfitting

rozmiary ukrytych warstw historia metryki
16,8,4, batch 64 wykres wykres
32,16,8, batch 64 wykres wykres
64,32,16, batch 64 wykres wykres
256,128,4,64, batch 64 wykres wykres
  • jeśli sieć nie jest dostatecznie duża lub nie jest trenowana przez dostatecznie dużo epok to dochodzi do sytuacji, w której sieć neuronowa ma osiągi gorsze niż te, które potencjalnie mogłaby osiągnąć.
  • ilość neuronów w warstwie determinuje jak złożona będzie funkcja reprezentowana przez tą warstwę, nie należy więc używać warstw o liczbie neuronów mniejszej niż rozmiar problemu (w naszym przypadku o liczbie neuronów mniejszej niż 10), w żadnej z warstw ukrytych, aby nie doszło do utraty informacji.
  • ilość ukrytych warstw powinna zależeć od przewidywanej regularności aproksymowanej funkcji dla danego problemu, im większa regularność tym zastosowanie większej ilości ukrytych warstw jest bardziej uzasadnione
  • ilość epok, przez które trenowana jest sieć powinna być taka, żeby trenowanie zakończyło się w momencie gdy sieć zaczyna przetrenowywać

About

Standard implemetation of a multi-layer percepton, written in python

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages