Sieć neuronowa (neural_net)

MetodaDeklaracja metodyPrzykład wywołaniaOpis działania
Deklaracja sieci neuronowejneural_net()neural_net nnZadeklarowanie sieci neuronowej. W przykładzie sieć ma nazwę 'nn'
Tworzenie sieci o zadanej architekturze warstwneural_net(int i,int h,int ha,int oa)neural_net nn(1,2,logistic,linear)Zadeklarowanie sieci neuronowej, posiadającej 'i' wejść, 'h' neuronów w warstwie ukrytej. Aktywacja warstwy ukrytej odbywa się za pomocą funkcji 'ha', a aktywacja warstwy wyjściowej za pomocą funkcji 'oa'. Numery i nazwy funkcji aktywacji:
0 – undefined (nieokreślona)
1 – logistic ()
2 – tanhyp ()
3 – linear ( )

W przykładzie powstaje sieć o jednym wejściu, 2 neuronach ukrytych. Funkcje aktywacji są typu 'logistic'.
Definiowanie wzorców (danych)void set_patterns(const matrix &p_in,const matrix &p_out,int set=0)nn.set_patterns(x,y,learn_set)Definiowane są wzorce uczące: 'p_in' - wejściowe (zmienne objaśniające), 'p_out' – wyjściowe (zmienna objaśniana). Wybrać należy zbiór 'set':
0 – learn_set (zbiór uczący)
1 – valid_set (zbiór walidacyjny, pomocniczy przy uczeniu)
2 – test_set (niezależny zbiór testowy)

W przykładzie definiowany jest zbiór uczący dla zmiennych x i zmiennej objaśnianej y.
Liczba wzorcówint patterns(int set=0)nn.patterns(learn_set)Liczba wzorców w danych zbiorze 'set'.
Informacja o danychvoid datainfo()nn.datainfo()Zbiorcza informacja o danych: liczba wzorców we wszystkich zbiorach danych (0, 1 i 2)
Wybór funkcji aktywacjivoid set_activ_fun(int ha=logistic,int oa=logistic)nn.set_activ_fun(logistic,linear)Wybierane są funkcje aktywacji dla warstwy ukrytej i wyjściowej.
Inicjalizacjavoid init(double c=0.02)nn.init()Inicjalizacja połączeń przed rozpoczęciem uczenia. Parametr 'c' określa wielkość parametrów losowych.
Prosta inicjalizacjavoid init_simply(double c=0.02)nn.init_simply()Prosta inicjalizacja połączeń przed rozpoczęciem uczenia. Inicjalizowane jest tylko po jednym połączeniu od każdego wejścia. Parametr 'c' określa wielkość parametrów losowych.
Inicjalizacja pojedynczego wejściavoid init_single_input(int v_in,int h,int pos=1,double c=0.02)nn.init_single_input(10,5,1)Inicjalizacja połączeń od danego wejścia. Wybiera się numer wejścia 'v_in', liczbę aktywowanych neuronów ukrytych 'h' i położenie w warstwie ukrytej 'pos'. Parametr 'c' określa wielkość parametrów losowych.
W przykładzie inicjalizowane są połączenia od 10 wejścia do 1, 2, 3, 4 i 5 neuronu ukrytego.
Inicjalizacja do realizacji funkcji binarnejvoid init_binfun(int v_in,int pos=1)nn.init_binfun(10,15)Inicjalizacja realizująca kodowanie binarne. Dotyczy tylko sieci aktywowanych za pomocą funkcji (tanhyp, linear) i zmiennej zero-jedynkowej na wybranym wejściu. 'v_in' to numer wejścia, 'pos' to pozycja wykorzystanego neuronu w warstwie ukrytej (wykorzystany jest 1 neuron). Połączenia są ustawiane na wartości realizujące kodowanie binarne (nie wymagają uczenia).
W przykładzie inicjalizuje się połączenia dla zmiennej nr 10, biegnące do neuronu 15.
Inicjalizacja do realizacji kodowania ciągłegovoid init_confun(int v_in,int pos=1)nn.init_confun(10,15)Inicjalizacja realizująca kodowanie ciągłe funkcją tanh4. Dotyczy tylko sieci aktywowanych za pomocą funkcji (tanhyp, linear) i zmiennej ciągłej na wybranym wejściu. 'v_in' to numer wejścia, 'pos' to pozycja wykorzystanego neuronu w warstwie ukrytej (wykorzystany jest 1 neuron). Połączenia są ustawiane na wartości realizujące kodowanie ciągłe tanh (wymagane jest uczenia).
W przykładzie inicjalizuje się połączenia dla zmiennej nr 10, biegnące do neuronu 15.
Liczba warstw wejściowychint size_in()nn.size_in()Zwraca liczbę neuronów wejściowych
Liczba warstw ukrytychint size_hid()nn.size_hid()Zwraca liczbę neuronów ukrytych
Funkcja aktywująca warstwy ukryteint act_hid()nn.act_hid()Zwraca numer funkcji aktywującej warstwę ukrytą:
0 – undefined
1 – logistic
2 – tanhyp
3 – linear
Funkcja aktywująca warstwę wyjściowąint act_out()nn.act_out()Zwraca numer funkcji aktywującej warstwę wyjściową:
0 – undefined
1 – logistic
2 – tanhyp
3 – linear
Struktura siecivoid structure()nn.structure()Wyświetla strukturę sieci:
- layer size – liczba neuronów w warstwie wejściowej, ukrytej i wyjściowej
- activation – funkcje aktywacji (wejście → ukryte, ukryte → wyjście)
- parameters – liczbę niezerowych parametrów dla połączeń (wejście → ukryte, bias → ukryte, ukryte → wyjście, bias → wyjście)
Zmiana rozmiaru siecivoid resizec(int i_new,int h_new)nn.resizec(10,5)Zmiana liczby wejść z bieżącej na 'i_new' oraz liczby neuronów ukrytych z bieżącej na 'h_new'. Zachowywane są wartości połączeń.
Dodanie neuronu w warstwie ukrytejvoid add_hid(int v_in,int pos,double c=0.02)nn.add_hid(8,5)Dodanie neuronu w warstwie ukrytej. Połączenie od wejścia 'v_in' do pozycji 'pos'. Parametr 'c' określa wielkość parametrów losowych.
Liczba używanych neuronów ukrytychint used_hid()nn.used_hid()Zwraca liczbę używanych neuronów w warstwie ukrytej. Neuron jest używany, jeśli jest aktywowany przez wcześniejszą warstwę.
Przesunięcie neuronów w warstwie ukrytejvoid shift_hid(int s)nn.shift_hid(10)Neurony w warstwie ukrytej są przesuwane o 's' pozycji.
Łączenie dwóch siecivoid merge(neural_net &n1,neural_net &n2,double c1=0.5,double c2=0.5,double c0=0.0)nn.merge(n1,n2)Łączenie sieci 'n1' i 'n2'. Otrzymana sieć daje wyniki będące kombinacją liniową składowych:
value(x)=c1*n1.value(x)+c2*n2.value(x)+c0
Dołączenie sieci do istniejącej siecivoid join(neural_net &n1,double c1=1.0)nn.join(n1)Dołączenie sieci 'n1' do bieżącej sieci. Po dołączeniu bieżąca sieć daje wyniki będące kombinacją liniową sieci przed dołączeniem i sieci dołączanej:
value(x)=value(x)+c1*n1.value(x)
Przemnożenie wag drugiej warstwy przez stałąvoid w2b2_mul(double c)nn.w2b2_mul(2.0)Połączenia od warstwy ukrytej do wyjściowej są mnożone przez stałą 'c'.
Przykładowo, sieć będzie dawać wyniki 2 razy większe.
Dodanie wartości do biasu drugiej warstwyvoid b2_plus(double c)nn.b2_plus(8.5)Bias warstwy wyjściowej jest zwiększany o stałą 'c'.
Przykładowo, sieć będzie dawać wyniki zwiększone o 8.5.
Wypełnienie nieużywanych połączeń losowymi wartościamivoid refill(double c)nn.refill(0.02)Nieużywane połączenia są inicjowane losowymi wartościami, o których wielkości decyduje stała 'c'.
Dodanie jednego połączenia w pierwszej warstwievoid rand_add_w1(double c)nn.rand_add_w1(0.02)Dodawane jest losowo połączenie w pierwszej warstwie
Dodanie jednego połączenia w drugiej warstwievoid rand_add_w2(double c)nn.rand_add_w2(0.02)Dodawane jest losowo połączenie w drugiej warstwie
Dodanie połączenia w obu warstwachvoid rand_add_w2w1(double c)nn.rand_add_w2w1(0.02)Dodawane jest losowo połączenie w pierwszej i w drugiej warstwie
Usunięcie jednego połączenia w pierwszej warstwievoid rand_del_w1()nn.rand_del_w1()Usuwane jest losowo połączenie w pierwszej warstwie
Usunięcie jednego połączenia w drugiej warstwievoid rand_del_w2()nn.rand_del_w2()Usuwane jest losowo połączenie w drugiej warstwie
Redukcja połączeń siecivoid reduction(double c=0.02)nn.reduction(0.01)Połączenia sieci o wadze mniejszej co do wartości bezwzględnej od 'c' są zerowane
Aktywacja połączeń nieaktywnychvoid rand_fill0(double c=0.02)nn.rand_fill0(0.01)Połączenia o wartości zero są aktywowane wartościami losowymi z zakresu [0,c]
Dopasowanie sieci do danychint fit(int iter=100,int grad_desc=1,int lev_marq=1,int layer_1=1)nn.fit()Sieć jest dopasowywana do danych. Znajdowane jest minimum funkcji błędu dla prób bootstrapowych. Parametry funkcji:
- iter – liczba iteracji (domyślnie 100)
- grad_desc – metoda gradientu sprzężonego (domyślnie włączona)
- lev_marq – metoda Levenberga-Marquardta (domyślnie włączona)
- layer_1 – modyfikacja połączeń w pierwszej warstwie (domyślnie włączona)
Uczenie sieciint learn(int min_iter=100,int max_iter=1000,int slow_steps=10,double tol_err=1e-8,int grad_desc=1,int lev_marq=1,int layer_1=1,int regul=1)nn.learn()Sieć jest uczona. W wyniku otrzymywany jest model o właściwościach generalizujących. Parametry funkcji:
- min_iter – minimalna liczba iteracji (domyślnie 100)
- max_iter – maksymalna liczba iteracji (domyślnie 1000)
- slow_steps – liczba wolnych kroków, po których uczenie zostaje przerwane (domyślnie 10)
- tol_err – dokładność uczenia (domyślnie 1e-8)
- grad_desc – metoda gradientu sprzężonego (domyślnie włączona)
- lev_marq – metoda Levenberga-Marquardta (domyślnie włączona)
- layer_1 – modyfikacja połączeń w pierwszej warstwie (domyślnie włączona)
- regul – czy ma być zastosowana regularyzacja (domyślnie tak)
Uczenie z równoczesną walidacjąint learn_and_valid(int min_iter=100,int max_iter=1000,int slow_steps=10,double tol_err=1e-8,int grad_desc=1,int lev_marq=1,int layer_1=1)nn.learn_and_valid()Sieć jest uczona i jednocześnie walidowana. W wyniku otrzymywany jest model o właściwościach generalizujących. Parametry funkcji są analogiczne jak dla 'learn', z tym że nie ma parametru regularyzacji. (Metoda niepolecana, ponieważ walidacja niedostatecznie zabezpiecza przed przeuczeniem.)
Resetowanie procesu uczeniavoid reset()nn.reset()Proces uczenia jest resetowany
Błąd dopasowaniadouble error(int set=0)nn.error(0)Zwraca błąd dopasowania dla zbioru o numerze 'set'
Korelacja wartości obserwowanych i predykowanychdouble corr(int set=0)nn.corr(0)Zwraca wartość korelacji wartości obserwowanych i predykowanych dla zbioru o numerze 'set'
Skuteczność predykcjidouble AR(int set=0)nn.AR(0)Zwraca wskaźnik AR dla zbioru o numerze 'set'
Wartość predykcjidouble value(const sparse &x)nn.value(x)Zwraca wartość predykcji sieci dla wejścia 'x'
Wartość predykcji dla wzorcówmatrix values(int set=0)nn.values(0)Zwraca zestaw wartości predykcji sieci dla zbioru wzorców o numerze 'set'
Zapis siecivoid save(Text name)nn.save("siec.txt")Zapis sieci do pliku o nazwie 'name'
Wczytanie siecivoid load(Text name)nn.load("siec.txt")Wczytanie sieci z pliku o nazwie 'name'
Wczytanie struktury siecivoid load_structure(Text name)nn.load_structure("siec.txt")Wczytanie struktury sieci z pliku o nazwie 'name'. Połączenia są inicjowane losowymi wartościami.
Skasowanie siecivoid free()nn.free()Skasowanie sieci. Zwalniana jest pamięć przydzielona na ten obiekt.