Strona używa cookies (ciasteczek). Dowiedz się więcej o celu ich używania i zmianach ustawień. Korzystając ze strony wyrażasz zgodę na używanie cookies, zgodnie z aktualnymi ustawieniami przeglądarki.    X

Matlab: Sieci neuronowe

Sztuczne sieci neuronowe

Sztuczne sieci neuronowe służą do obliczeń i analizy sygnałów. Podstawową jednostką jest neuron. Jest to przybliżony opis matematyczny ludzkiego neuronu. Następnym stopniem abstrakcji jest sama sieć czyli połączenie neuronów. Struktur jest sporo od sieci radialnych po sieci rekurencyjne, niemniej poniżej przedstawię prostą strukturę jednokierunkową wielowarstwową.

Sieć składa się z N neuronów wejściowych czyli wejść sieci, gdzie liczba neuronów N równa liczbie wprowadzanych sygnałów. Warstwa ukryta jest tak naprawdę główną warstwą w której dokonywane są obliczenia może się składać z dowolnej liczby neuronów, i dowolnej liczby warstw. Jednak zazwyczaj nie więcej niż 3 warstwy ukryte. W torach łączących neurony znajdują się wagi czyli pewne stałe przez które mnoży się płynący sygnał, ma to na celu wzmocnienie najważniejszych sygnałów. Następnie mamy warstwę wyjściową gdzie pojawia się żądany sygnał.
Procesów uczenia sieci wyróżniamy także kilka. Np. proces uczenia z nauczycielem. Oprócz danych wejściowych mamy porządny sygnał wyjściowy. Teraz sieć będzie dążyć aby wartość wyjściowa z sieci była jak najbliższa wartości rzeczywistej którą posiadamy(zmieniając np. wagi).
Najważniejsza cechą sieci neuronowej jest generalizacja. Mówiąc najkrócej. Sieć uczymy na pewnym zbiorze danych, jednak jak wiadomo zbiór taki to tylko część możliwych wartości wejściowych. Sieć przy innych wartościach wejściowych powinna jak najlepiej odwzorowywać wartość wyjściową. Pojawia się także problem tzw. przeuczenia. Tracimy wtedy zdolność generalizacji ponieważ sieć jest zbyt dobrze nauczona. Czyli podaliśmy na wejście bardzo dużo próbek i uczyliśmy ją długi czas. I dla próbek uczących zminimalizowaliśmy błąd wyjściowy ale gdy podamy na wejście sieci podczas pracy inne wartości błędy na wyjściu będą duże.

Silnik indukcyjny

Układem który będzie dostarczał próbek i wartości testowych będzie prosty model silnika indukcyjnego.
Krótko o budowie silnika indukcyjnego. Silnik składa się z stojana w którym mamy uzwojenie trójfazowe, a także wirnika który umieszczony jest na wale i to on się obraca. Wirnik może być klatkowy(klatka zbudowana z prętów) lub pierścieniowy gdzie mamy zwykłe uzwojenie trójfazowe. Najpopularniejszy jest pierwszy typ. Zasada działania polega na tym iż zasilamy stojan z sieci 3f, wytwarzane jest pole wirujące które przecina wirnik(np. Pręty klatki), w wirniku indukowane jest napięcie i płyną prądy. Pojawia się pole wirnika i dzięki zjawiska fizycznym silnik rusza.
Poniższy silnik opisany jest w układzie współrzędnych alfa-beta. Mówiąc najprościej za pomocą układu równań przekształca się napięcia i prądy trójfazowe na układ alfa-beta po to aby uzyskać prostszy opis.

Model do ściągnięcia

Symulacje

Skorzystamy z dwóch plików w simulinku. Pierwszy model dostarczy wartości uczących drugi będzie już służył do testowania obiektu, jedyna różnicą pomiędzy nimi jest zadany moment obciążenia, to właśnie on będzie zmiennym parametrem. Parametrami uczącymi będą prądy stojana i wirnika w układzie alfa-beta, a także ich próbki historyczne(opóźnienie 1/z). Wartością wyjściową której szukamy to moment elektromagnetyczny silnika. Zanim przejdziemy do modelu ktoś może zapytać po co estymować moment skoro go można zmierzyć? Ponieważ pomiar momentu silnika ani łatwy ani tani nie jest. Najprościej jest mierzyć go estymując za pomocą prądów fazowych i napięć między fazowych ponieważ te pomiary są łatwe do przeprowadzenia. A po co mierzyć sam moment? Struktury sterowania silnikami(sterowanie wektorowe) wymagają niekiedy obecności momentu w sprzężeniu zwrotnym.

Matlab

Skorzystamy z gotowego toolboxa w matlabie.

X=[iraz';ira0';irbz';irb0';isaz';isa0';isbz';isb0']; % PARAMETRY UCZĄCE
X_test=[irazt';ira0t';irbzt';irb0t';isazt';isa0t';isbzt';isb0t']; % PARAMETRY TESTOWE
siec=newff([-4 4; -4 4;-4 4;-4 4;-4 4;-4 4;-4 4;-4 4],[5 1],{'tansig','purelin'}); % NOWA SIEĆ
siec.trainParam.epochs = 50; % 50 ITERACJI
siec.trainParam.min_grad=1e-3; %MINIMALNY GRADIENT
siec.trainParam.alpha=0.001;
siec_t=train(siec,X,me0'); % TRENOWANIE SIECI
ynnm=sim(siec_t,X_test); %TESTOWANIE SIECI NA ZBIORZE TESTUJĄCYM, Wyście sieci czyli moment elektromagnetyczny.
siec=newff([-4 4; -4 4;-4 4;-4 4;-4 4;-4 4;-4 4;-4 4],[5 1],{'tansig','purelin'});
siec.trainParam.epochs = 150;
siec.trainParam.min_grad=1e-3;
siec.trainParam.alpha=0.001;
siec_t=train(siec,X,me0');
ynn2m=sim(siec_t,X_test);
siec=newff([-4 4; -4 4;-4 4;-4 4;-4 4;-4 4;-4 4;-4 4],[10 1],{'tansig','purelin'});
siec.trainParam.epochs = 150;
siec.trainParam.min_grad=1e-3;
siec.trainParam.alpha=0.001;
siec_t=train(siec,X,me0');
ynn3m=sim(siec_t,X_test);
figure(1)
plot(w0.time,me0,'black'); % MOMENT Elektromag. PODCZAS UCZENIA
figure(2)
plot(w0.time,Mo,'black'); % MOMENT OBCIĄŻENIA PODCZAS UCZENIA
figure(3)
plot(w0.time,Mot); % MOEMNT OBCIĄŻENIA TESTOWY
figure(4)
plot(w0.time,me0t,'black'); % MOMENT ELEKTROMAG. Podczas uczenia
hold on
plot(w0.time,ynnm,'r'); % WYJŚCIE SIECI
plot(w0.time,ynn2m,'g');
plot(w0.time,ynn3m,'y');
figure(5)

Polecenie newff tworzy nową sieć neuronową typu feed-forward z propagacją wsteczną. Pierwszą wartością funkcji są maksymalne i minimalne wartości sygnałów wejściowych. Długość tablicy jest równa ilości wejść. Drugą wartością są liczby neuronów w warstwach ukrytych i wyjściowej. Np. [10 5 1] Oznacza iż jest 10 neuronów w warstwie ukrytej 1 , 5 neuronów w warstwie ukrytej 2 i jeden neuron w warstwie wyjściowej. Dalej mamy funkcje aktywacji dla poszczególnych warstw. Funkcja aktywacji transformuje poziom aktywacji neuronu na sygnał wyjściowy tzn. Na neuron wchodzą sygnały i są one miara pobudzenia neuronu następnie są odpowiednio porównywane z funkcją aktywacji(np. Funkcją liniową) i na tej podstawie generowane jest wyjście neuronu.
Polecenie train służy do trenowania sieci. Pierwsza wartość to sieć stworzona wcześniej, następnie zbiór uczący i ostatnia wartość to wartość porządna.
Polecenie sim służy do testowania sieci. Podajemy na pierwszym miejscu wytrenowaną sieć a następnie zbiór testowy(wartości z drugiego modelu). Wartością wyjściową sim jest tuaj moment elektromagnetyczny.

Wyniki:

Podsumowanie:

W wypadku jednej warstwy ukrytej zwiększenie liczby iteracji znacznie polepsza wyniki. Zwiększenie liczby neuronów daje nie wiele. A teraz zadanie dla czytelników proszę dołożyć drugą warstwę ukrytą :) 

oprogramowanie porady programowanie

Komentarze

0 nowych
Chemical Attack   4 #1 26.01.2013 15:16

Kolego kawał dobrej roboty naukowej tutaj widzę.. Kiedyś na jednym seminarium mój kolega przedstawiał podobne zagadnienie:D a może to TY byłeś? Ciekawy wpis i dużo wyników. Zapewne własnej roboty. Pozdrawiam!

revcorey   6 #2 26.01.2013 16:10

Nie jestem tym kolegą. Robota własna. NA laborce miałem neuronówkę na dwu masowym a chciałem zobaczyć jak zadziała z silnikiem indukcyjnym. Rozważałem też zaimplementowanie w C z wyk. FNAA estymatora momentu na procku TMS320F2812 ale nie wiem czy będę miał czas. Najwyżej zamiast DSP texasa zrobię to w stm32 kiedyś.
Wybrałem silnik indukcyjny bo często na uczelni to są czysto akademickie rozważania nad jakimś tam prostym układem ale nikt później nie wie po co by to można wykorzystać. A własnie estymacja momentu jest bardzo ważna w sterowaniu silnikami.

Autor edytował komentarz.
DjLeo MODERATOR BLOGA  17 #3 26.01.2013 16:12

Nic z tego nie kumam... :) ale wierze, że to ma sens :)

revcorey   6 #4 26.01.2013 16:18

"Nic z tego nie kumam... :) ale wierze, że to ma sens :)"
Najprościej ujmując.
Masz sieć neuronową. Uczysz ją jakimś sygnałem jednocześnie pokazujesz sieci co ma być na wyjściu. Sygnał uczący jest związany oczywiście z sygnałem wyjściowym oczekiwanym np. Podajemy wartość napięcia na wejście a na wyjściu mamy prąd, ten prąd wyjściowy podczas nauki jest porównywany z zadanym prądem którego oczekujemy, i sieć tak się ustawia żeby te dwie wartości były takie same. Teraz po nauce na wejście sieci podjesz inne wartości sygnału np. znowu to napięci tylko że o innej wartości i teraz sieć na podstawie poprzednich doświadczeń próbuje na wyjściu dać wartość prądu która powinna być bliska z rzeczywistą wartością. Czyli żeby w układzie zmierzyć prąd nie musisz już go mierzyć tylko wystarczy pomiar napięcia i podanie sygnału na sieć neuronową i wiesz jaki prąd płynie w obwodzie.

Autor edytował komentarz.
  #5 26.01.2013 16:22

totalne podstawy ze sztucznej inteligencji na każdej praktycznie uczelni i tyle

McDracullo   16 #6 26.01.2013 18:09

:) Najprościej mówiąc - dobra robota. Co prawda po całym dniu z Matlabem nie mam już siły. :)

Dwa pytania:
Pierwsze pytanie - jak uprościć tworzenie sieci (ograniczyć się go kilku przeklików)? Skorzystać z narzędzia ntstool.

Drugie pytanie - jak przyspieszyć naukę sieci w Matlabie? :)

Same sieci mają bardzo potężne możliwości :) Nie tylko wyciąganie zmiennych stanu, ale także rozpoznawanie wzorców czy sterowanie obiektami nieliniowymi.

chasar   4 #7 26.01.2013 18:11

revcorey tak z ciekawości zapytam co studiujesz i gdzie ?

revcorey   6 #8 26.01.2013 18:18

"
Drugie pytanie - jak przyspieszyć naukę sieci w Matlabie? :)"
Najprościej to zmniejszyć liczbę iteracji i pożądany gradient. Zbyt duża liczba iteracji też nie jest dobra i nic nie wnosi. Liczba warstw/neuronów też zbyt duża często nie ma sensu. Istnieją też metody optymalizacji sieci jak wycinanie połączeń pomiędzy neuronami itp. ale tu trzeba by od zera tworzyć sieć a nie korzystać z toolboxa.

"revcorey tak z ciekawości zapytam co studiujesz i gdzie ?"
AiR, PWr, Elektryczny.

McDracullo   16 #9 26.01.2013 20:59

"Najprościej to zmniejszyć liczbę iteracji i pożądany gradient. Zbyt duża liczba iteracji też nie jest dobra i nic nie wnosi. Liczba warstw/neuronów też zbyt duża często nie ma sensu. Istnieją też metody optymalizacji sieci jak wycinanie połączeń pomiędzy neuronami itp. ale tu trzeba by od zera tworzyć sieć a nie korzystać z toolboxa."
Mi chodzi o coś bardziej systemowego. Jeśli masz procesor więcej niż 2 rdzeniowy nowy Matlab dziwnie rozkłada obciążenie - zmiana koligacji jedynie na dwa rdzenie przynosi (przynajmniej mi) dużo szybsze obliczenia :) W starszych Matlabach najprościej w ogóle przepiąć Matlaba na jeden rdzeń.


" "revcorey tak z ciekawości zapytam co studiujesz i gdzie ?"
AiR, PWr, Elektryczny. "
Takie rzeczy chyba tylko na Automatyce ;)

Autor edytował komentarz.
revcorey   6 #10 26.01.2013 21:32

"Mi chodzi o coś bardziej systemowego. Jeśli masz procesor więcej niż 2 rdzeniowy nowy Matlab dziwnie rozkłada obciążenie - zmiana koligacji jedynie na dwa rdzenie przynosi (przynajmniej mi) dużo szybsze obliczenia :)"
Kiedyś czytałem o rozbijaniu na wątki w matlabie to jest tak.
Część funkcji jak cos,fft itp. potrafi się z automatu robić na wątki o ile to możliwe. To zależy od wersji matlaba im nowszy tym więcej. Można też użyć polecenia matlaba do tworzenia nowych zadań.

"
Takie rzeczy chyba tylko na Automatyce ;)"
Na dzień dzisiejszy w automatyce(przynajmniej w Polsce) w polskim przemyśle jedzie się na starych sprawdzonych rozwiązaniach niemniej z rzadka trafiają się projekty które oparto o sterowanie rozmyte. O tym że tworzono sieci neuronowe na potrzeby zadania nie słyszałem w ogóle aczkolwiek nie wykluczam że były pojedyncze projekty.

Autor edytował komentarz.
McDracullo   16 #11 26.01.2013 21:47

"Kiedyś czytałem o rozbijaniu na wątki w matlabie to jest tak.
Część funkcji jak cos,fft itp. potrafi się z automatu robić na wątki o ile to możliwe. To zależy od wersji matlaba im nowszy tym więcej. Można też użyć polecenia matlaba do tworzenia nowych zadań."
Masz może namiary na źródło? Chętnie poczytał bym coś na ten temat, bo wielowątkowość w Matlabie to bardzo ciekawa sprawa (i jednocześnie zagadkowa) - chodzi jak mu się podoba ;)

"Na dzień dzisiejszy w automatyce(przynajmniej w Polsce) w polskim przemyśle jedzie się na starych sprawdzonych rozwiązaniach niemniej z rzadka trafiają się projekty które oparto o sterowanie rozmyte. O tym że tworzono sieci neuronowe na potrzeby zadania nie słyszałem w ogóle aczkolwiek nie wykluczam że były pojedyncze projekty."
Mi raczej nie chodziło o materiał na uczelni. Projekty z sieciami były chyba w Lotosie w GDA, ale pewien nie jestem ;)

revcorey   6 #12 26.01.2013 21:52

"Masz może namiary na źródło?"
Strona mathworksa.

  #13 26.01.2013 22:08

Eh te sieci neuronowe. Dwa semestry systemów inteligentnych zrobiły swoje i teraz uważam, że to bardzo ciekawe zagadnienie. Miałem to szczęście, że zajęcia prowadził gość, który zna się na rzeczy i (podobno) jest autorytetem w tej dziedzinie. Kiedyś trzeba będzie bardziej zagłębić się w temat :)

Humanoid   5 #14 26.01.2013 22:46

O żesz w mordę. To wygląda gorzej, niż podstawy biologii w szkole średniej... Przynajmniej ciekawsze jest ;]

Maniek_88   9 #15 27.01.2013 10:57

Zainspirowałeś mnie :)
Ostatnio dużo w matlabie spędziłem przy okazji laboratorium z obróbki sygnałów mowy, jak znajdę czas to opiszę zagadnienia z rozpoznawania mowy i mówcy i ich prostą realizację w matlabie :) Z sieci neuronowych nie wiem nic, ale widać że i takie artykuły na DP mają sens ;)

revcorey   6 #16 27.01.2013 10:59

Ostatnio jak się pokazał nieco słabej jakości artykuł o sztucznej inteligencji ludzie chcieli coś o tym. A to tak wygląda w rzeczywistości :)

" takie artykuły na DP mają sens ;)"
Ja na dp adresuję artykuły raczej do wąskiej grupy odbiorców i do tych co trafią tutaj z google.

Autor edytował komentarz.
  #17 27.01.2013 13:04

Myślę, że powinieneś pokazać to na Octave, bo za darmo, więc niektórzy być może by wypróbowali

Niestety, tekst pisany po elficku i nic nie rozumiem

revcorey   6 #18 27.01.2013 13:11

Miało być jeszcze octave w zamyśle, ba początkowo robiłem to w scilab ale w scilab trwało to nieznośnie długo. Octave jest kompatybilne z matlabem ale w tym toolboxie nie do końca. A że mam sesje nie będę rozgryzał niuansów :)

Autor edytował komentarz.
misza_88   4 #19 27.01.2013 18:50

Przyjacielu, dlaczego nie zacząłeś pisać o MatLabie od października? Moje studia byłyby o wiele łatwiejsze i przyjemniejsze ;-)

revcorey   6 #20 27.01.2013 19:08

mój pierwszy artykuł o simulinku to 19.02 a o xcos jeszcze wcześniej :) Za tydzień już o octave ale octavejest kompatybilny z matlabem więc można będzie użyć matlaba ale co będzie tematem to tajemnica :)

  #21 18.05.2013 22:11

Witam
Proszę Cię o kontakt na rokul@interia.pl
Pozdrawiam

bartman   1 #22 01.09.2013 21:38

baziu jak ja Matlaba nie lubie ;)
ale temat z najwyższej półki

  #23 28.01.2014 21:33

Natrafiłam na Twój artykuł szukając czegoś co mi pomoże w projekcie. Niestety nie jest to to czego oczekiwałam. Może masz jakiś pomysł jak nauczyć sieć MLP rozpoznawać kolory RGB ? ;)
Jestem zielona i nawet nie wiem jak to zacząć.

revcorey   6 #24 31.01.2014 18:24

Witaj. Tutaj bardziej nadaje się inny rodzaj sieci np. sieci samoorganizujace http://kik.pcz.pl/nn/samoorg.php
http://www.cs.put.poznan.pl/kkrawiec/aied/NNMLW5.pdf
Poczytaj też w osowskim "sieci neuronowe"
A jak rozpoznawać kolory. Mając 3 wejścia po prostu podajemy nasycenie danego koloru i tak dobieramy parametry uczące żeby mówić że jak dużo jest tego to np. czerwony itd.