trainbpx rozpoznawanie zwierzat

POLITECHNIKA RZESZOWSKA

WYDZIAŁ ELEKTROTECHNIKI I INFORMATYKI

KATEDRA INFORMATYKI I AUTOMATYKI

SZTUCZNA INTELIGENCJA

PROJEKT

Temat: Zrealizować sieć neuronową uczoną algorytmem wstecznej propagacji błędu z przyśpieszeniem metodą adaptacyjnego współczynnika uczenia i metodą momentum (trainbpx) uczącą się rozpoznawania zwierząt.

Wykonał

Paweł Trzaska

II EF-DI

P15

Spis treści.

1.Opis problemu………………………………………………………………………….2

2.Topologia i funkcjonowanie sieci neuronowej………………………….4

2.1Informacje na temat sieci neuronowej…………………………..4

2.2Architektura jednokierunkowej sieci neuronowej…………6

3.Perceptron………………………………………………………………………………..7

4.Algorytmy użyte w programie…………………………………………………..10

5.Skrypt sieci neuronowej……………………………………………………………14

5.1Przygotowanie środowiska……………………………………………..14

5.2Wczytanie danych uczących……………………………………………14

5.3Kod programu…………………………………………………………………15

6.Eksperymenty……………………………………………………………………………19

7.Wnioski i podsumowanie…………………………………………………………..24

8.Bibliografia………………………………………………………………………………..24

Zawartość płyty CD:

-skrypt sieci neuronowej użyty do badań

-zestaw danych uczących

-print-screeny wykresów

-zbiór wyników eksperymentu

1.OPIS PROBLEMU

Celem projektu jest stworzenie sieci neuronowej, która na podstawie informacji dotyczących zwierząt jest w stanie rozpoznać je umieścić w jednej z 7 klas:

  1. Ssaki

  2. Ptaki

  3. Gady

  4. Ryby

  5. Płazy

  6. Owady

  7. Bezkręgowce.

Sieć ma się uczyć rozpoznawać zwierzęta na podstawie 17 atrybutów informacji.

Zestaw danych użyty do stworzenia projektu został pobrany ze strony Uniwersytetu

Kalifornijskiego w Irvine(http://archive.ics.uci.edu/ml/datasets/Zoo). Autorem repozytorium jest Richard Forsyth. Baza zawiera 101 rekordów zwierząt z 7 klas.

Klasa Liczebność klasy Zwierzęta
1 41 mrówkojad, antylopa, niedźwiedź, dzik, bawół, ciele, gryzoń, gepard, jeleń, delfin, słoń, nietoperz, żyrafa, dziewczyna, koza, goryl, chomik, zając, lampart, lew, ryś, norka, kret, mangusta, opos, oryks, dziobak, tchórz, koń, morświn, puma, kot, jenot, renifer, foka, uchatka, wiewiórka, wampir, nornica, walabia, wilk
2 20 kura, wrona, gołąb, kaczka, flaming, rybitwa, jastrząb, kiwi, skowronek, struś, papuga, pingwin, bażant, struś, brzytwodziób, wydrzyk, wróbel, łabędź, sęp, strzyżyk
3 5 mokasyn dalekowschodni, wąż morski, padalec, żółw, łupkoząb
4 13 okoń, karp, sum, kleń, koleń, plamiak, śledź, szczupak, pirania, konik morski, sola, trygon, tuńczyk
5 4 żaba, żaba, traszka, ropucha
6 8 pchła, komar, pszczoła, mucha, biedronka, ćma, termity, osy
7 10 małż, krab, rak, homar, ośmiornice, skorpion, meduza, ślimak, rozgwiazda, robak

Każdemu zwierzęciu jest przyporządkowane 18 atrybutów(nazwa zwierzęcia, 15 atrybutów logicznych i 2 numeryczne)

Numer Atrybut : typ
1 Nazwa zwierzęcia : unikalna dla każdego przypadku
2 Czy ma włosy : prawda/fałsz
3 Czy ma pióra : prawda/fałsz
4 Czy znosi jajka : prawda/fałsz
5 Czy daje mleko : prawda/fałsz
6 Czy jest latające : prawda/fałsz
7 Czy jest morskie : prawda/fałsz
8 Czy jest drapieżne : prawda/fałsz
9 Czy jest uzębione : prawda/fałsz
10 Czy jest kręgowcem : prawda/fałsz
11 Czy jest oddychające : prawda/fałsz
12 Czy jest jadowite : prawda/fałsz
13 Czy ma płetwy : prawda/fałsz
14 Ile ma nóg: numeryczne(wartości: {0,2,4,5,6,8})
15 Czy ma ogon : prawda/fałsz
16 Czy to jest zwierze domowe : prawda/fałsz
17 CZy jest dużym kotem : prawda/fałsz
18 Do której klasy należy : numeryczne(w przedziale [1,7])

2.TOPOLOGIA I FUNKCJONOWANIE SIECI NEURONOWEJ

2.1.Informacje na temat sieci neuronowej.

Nazwą „sieć neuronowa” określamy symulatory(sprzętowe lub programowe) modeli matematycznych, realizujące równoległe przetwarzanie informacji i składające się z wielu połączonych wzajemnie neuronów. Inspiracją do stworzenia tychże sieci był ludzki mózg. Sieci te mają na celu naśladowanie działania biologicznych struktur mózgowych – struktury nerwowej potrafiącej odbierać docierające sygnały i przetwarzać je na użyteczne informacje. Symulatory takie powszechnie nazywane są „Neural networks” bądź „AI”(od Artifical Inteligence - sztuczna inteligencja).

Sieci neuronowe funkcjonujące w postaci modeli zwane są też „sztucznymi sieciami neuronowymi” w skrócie SSN i powstały one w wyniku interdyscyplinarnego1 połączenia nauk tradycyjnych(fizyka, chemia, matematyka, biologia).

Tym co wyróżnia SSN pośród programów realizujących przetwarzanie informacji w sposób algorytmiczny jest to iż sieci neuronowe posiadają zdolność generalizacji2 wiedzy dla nowych danych które wcześniej były nieznane(nie były prezentowane podczas nauki). Inaczej mówiąc SSN posiada zdolność do aproksymacji wartości funkcji wielu zmiennych czego przeciwieństwem jest interpolacja którą otrzymujemy przy przetwarzaniu algorytmicznym. Ujmując to jeszcze inaczej systemy ekspertowe wymagają zgromadzenia i dostępu wiedzy na której temat będą rozstrzygać, SSN zaś wymaga jednorazowego nauczenia przy czym wykazuje znaczną tolerancję na braki, nieciągłości czy inne zaburzenia w zbiorze uczącym. Jest to duża zaleta która pozwala zastosowanie tego rozwiązania tam gdzie nie ma innego efektywnego sposobu rozwikłania danego problemu.

Główne zastosowania sieci neuronowych:

Zalety SSN:

  1. SSN nie wymagają programowania, projektujemy sieć a ta sama się uczy

  2. W wielu zadaniach spisują się dużo lepiej niż zwykłe algorytmy(na przykład w zastosowaniach które wymieniłem powyżej).

  3. Może działać nawet przy niekompletnej lub uszkodzonej bazie danych.

  4. Potrafi uogólniać wiedzę czyli na przykład rozpoznając podstawowe kolory rozpozna też kolory podobne do nich.

Wady SSN:

  1. Nie są przystosowane do działań dających precyzyjne i jasne wyniki.

  2. Operuje pojęciami rozmytymi, gdy na przykład chcemy uzyskać odpowiedź typu TAK lub NIE system powie „raczej nie” „chyba tak”.

  3. SSN nie potrafi rozumować wieloetapowo, na przykład wnioskować na podstawie wcześniejszego rozumowania.

2.2.Architektura jednokierunkowej sieci neuronowej

Odnosząc się do problemu rozpoznawania zwierząt będzie interesować sieć neuronowa jednokierunkowa.

Sieci jednokierunkowe to sieci w których nie występuje zjawisko sprzężenia zwrotnego, pojedynczy sygnał przechodzi przez każdy neuron dokładnie raz w swoim cyklu. Najprostszym modelem takiej sieci może być pojedynczy perceptron.

W zaawansowanych formach tego typu sieci stosuje się funkcję przejścia. Najczęściej używanymi funkcjami są funkcje sigmoidalne, liniowe, funkcje skoku czy funkcje hiperboliczne. Tego typu sieć zbudowana z neuronów o nieliniowej funkcji przejścia posiada zdolność nieliniowej separacji wzorców wejściowych(staje się uniwersalnym klasyfikatorem).

Sieci jednokierunkowe dzielą się zasadniczo na jednowarstwowe, dwuwarstwowe i wielowarstwowe. Sieci jednowarstwowe są w stanie rozwiązać jedynie wąską klasę problemów o małej złożoności. Sieci o dwóch lub większej ilości warstw są w stanie rozwiązać szeroką gamę problemów o dużej złożoności, stosowane są w nich inne algorytmy uczenia niż przy sieciach jednowarstwowych. Przyjęte jest że sieć już o 3 warstwach neuronów jest w stanie poradzić sobie z każdym problemem(ludzki mózg ma 32 warstwy).

Przykładowa sieć 3 warstwowa

Powyższa sieć jest trójwarstwowa. Połączenia między warstwami są typu każdy z każdym. Sygnały wejściowe są podawane do warstwy wejściowej neuronów, których wyjścia dają sygnały dla kolejnych warstw.

Każda warstwa neuronów posiada macierz wag w i wektor przesunięć b , funkcję aktywacji f i wektor sygnałów wyjściowych y. Żeby ułatwić rozróżnianie ich do każdej wielkości dodałem numer warstwy której dotyczy umieszczony w nawiasie który we wzorach funkcjonuje w indeksie dolnym(np. dla warstwy drugiej macierz wag będzie oznaczona w2). Poszczególne warstwy działają według wzorów:

y1 = f1 (w1x+b1 )

y2= f2 (w2y1+b2 )

y3 = f3 (w3 y2+b3 )

Działanie całej sieci można więc opisać jako

Y3 = f3 (w3 f2 (w2 f1 (w1x+b1)+b2)+b3)

3.PERCEPTRON

Pisząc o jednokierunkowej sieci neuronowej wspomniałem o perceptronie jako najprostszym modelu sieci neuronowej tego typu. Jest to ważna część sieci dlatego pomówimy o nim szczegółowo.

Perceptron sam w sobie to sieć neuronowa najprostszego typu. Działanie perceptronu polega na klasyfikacji danych otrzymywanych na wejściu i ustawianiu wyjścia stosownie do nich. Przed właściwym użyciem perceptron należy trenować poprzez podanie mu przykładowego zestawu danych na wejście i zmianę wag wejść i połączeń między warstwami neuronów co ma na celu otrzymanie pożądanych wartości na wyjściu. Perceptrony posiadają zdolność klasyfikowania danych na zbiory liniowo separowane.

Sam prosty pojedynczy perceptron jest modelem neuronu McCullocha-Pittsa o odpowiedniej strategii uczenia. Neuron McCullocha-Pittsa jest podstawowym budulcem SSN. Funkcjonuje jako bardzo uproszczony matematyczny model biologicznego neuronu. Neuron ten posiada wiele wejść i jedno wyjście. Każde z wejść posiada swoją wagę.

Model neuronu McCullocha-Pittsa

Dane podane na wejściu x są mnożone przez ich wagi następnie sumowane(tu też dodawany jest tzw. bias) następnie suma jest podawana do funkcji aktywacji która przekazuje otrzymaną wartość do wyjścia

Model perceptronu

Tak właśnie wygląda prosty perceptron. Od u1 do um oznaczone są wejścia do sieci. Każde wejście posiada swoją indywidualną wagę, tutaj od w1 do wm. Sygnały po wejściu do sieci są przemnażane przez ich wagi, a następnie trafiają do sumatora gdzie wyciągana jest suma ważona. Później sygnał trafia do funkcji aktywacji która jest funkcją tego o otrzymała z sumatora i to od niej zależy co otrzymamy na wyjściu.

Istnieje wiele funkcji aktywacji, najważniejsze z nich to:

wzór: f(z)=z(1-z)

pochodna:

wzór: f(z)=1-a2

Każda taka funkcja przekształca otrzymaną sumę w inny sposób i to głównie od niej zależy to czy sieć będzie się uczyć we właściwy sposób.

Pokażmy więc jak wygląda to od strony matematycznej. Sygnał wyjściowy neuronu określa następujący wzór:


$$y = f\left( \sum_{i = 1}^{n}w_{i}\ x_{i} + \ b\ \right)$$

Ogólny wzór opisujący sygnał na wyjściu wygląda tak:


y = f(wx + b)

Sygnały ze wszystkich wejść x[x1,x2,x3,…,xn] są przemnażane przez ich wagi w[w1,w2,w3,…,wn], a następnie sumowane. W trakcie sumowania do sumy dodawany jest tzw. bias(wektor przesunięcia), następnie suma trafia do funkcji aktywacji gdzie po wykonaniu się funkcji sygnał trafia na wyjście.

4. ALGORYTMY UŻYTE W PROGRAMIE

Algorytmem uczenia sieci neuronowej w tym projekcie jest uczenie algorytmem wstecznej propagacji błędu z przyśpieszeniem metodą adaptacyjnego współczynnika uczenia i metodą momentum(trainbpx).

Algorytm wstecznej propagacji błędu BP (ang. BackPropagation) określa sposób dokonywania zmian i ich wartość w współczynnikach wagowych w i przesunięciach b aby sieć osiągała jak najmniejszy błąd średnio kwadratowy. Metoda ta wymaga zestaw danych uczących które mają postać par $(x,\hat{y})$ wektorów sygnałów wejściowych i pożądany wyjściowych które realizują rozwiązanie danego problemu. Na odstawie tych danych można zmieniać współczynniki wagowe i przesunięć i sprawdzać odpowiedź (sygnał wyjściowy y) sieci neuronowej. W przypadku rozbieżności wartości $y \neq \hat{y}$ można obliczyć błąd średnio kwadratowy (SSE) który stanowi miarę poprawności działania sieci neuronowej. Na podstawie miary błędu algorytm wstecznej propagacji błędu wpływa na obliczenia odpowiednich poprawek (różnic wag) które należy dodać do istniejących wag aby zmniejszyć dany błąd. Algorytm wstecznej propagacji błędu wykorzystuje gradientową metodą minimalizacji błędu, która znajduje zależności poszczególnych błędów warstw od poszczególnych współczynnikach wag. Niestety, algorytm nie jest doskonały. Nie ma pewności, że w trakcie procesu uczenia natrafimy na minimum globalne funkcji miary błędu a nie jak to się często zdarza minimum lokalne, dla których wartości sygnału wyjściowego różnią się od wartości sygnałów wzorcowych (znacznie). Zły dobór wartości początkowych, wag i nieodpowiedniej drogi może spowodować wpadnięcie w minimum lokalne, którego algorytm nie będzie w stanie opuścić. Wypada też zwrócić uwagę na fakt, iż funkcja miary błędu jest funkcją wielokrotnie symetryczną w wielowymiarowej przestrzeni wag, powoduje to występowanie wielu minimów globalnych i lokalnych. Na efektywność procesu uczenia mogą mieć wpływ różne czynniki:

Jak to działa???

Algorytm polega na cyklicznym dodawaniu do współczynnika wag odpowiednich j-tej warstwy i-tego neuronu poprawek w wynikających w poprzedniego cyklu uczenia t.


wij(t+1) = wij(t) + wij(t)

Wartość wij(t) jest obliczana na podstawie błędu średnio kwadratowego SSE. Iterację przerywamy gdy błąd średnio kwadratowy (SSE) jest mniejszy od err_goal. Błąd średnio kwadratowy wyznaczony dla wszystkich k neuronów, za pomocą poniższego wzoru:


$$E = \frac{1}{2}\sum_{j = 1}^{k}e_{j}$$

Gdzie ejwylicza się jako różnice odpowiedzi sieci neuronowej od pożądanej odpowiedzi z danych uczących:


$$e = y - \hat{y}$$

Wartość błędu średnio kwadratowego SSE zależy pośrednio od współczynników wag i przesunięć sieci. Jednakże dla par sygnałów wejściowych i wyjściowych (dane uczące) można zauważyć które wagi mają znaczący wpływ na wzrost tego błędu. Do tego wykorzystuje się gradientową metodę największego spadku, który określa właśnie zależności błędu od wag. Dlatego też należy ustanowić odpowiednie poprawki dla współczynników wag. Wprowadzono zmienną η (współczynnik uczenia) który uzależnia wielkość naniesionych poprawek dla i-tego neuronu j-tej wagi :


$$w_{\text{ij}} = - \eta\frac{\partial E}{\partial w_{\text{ij}}}$$

Wartość błędu bezpośrednio zależy od różnicy wartości sygnałów wyjściowych sieci y i pożądanych wyjścia $\hat{y}$ z danych uczących. Wartość sygnałów pożądanych wyjścia $\hat{y}$ dla danej paru uczącej jest zawsze stała zatem różnica zależy głównie od wartości i-tego sygnału wyjściowego wygenerowanego przez sieć.


E(yi)

Wartość sygnału odpowiedzi bezpośrednio zależy od wartości z zwanym łącznym pobudzeniem neuronu, ponieważ funkcja aktywacji przyporządkowuje odpowiednie sygnały wyjścia zależnie od pobudzenia neuronu.


yi(zi)

Wartość pobudzenia neuronu zależy bezpośrednio od macierzy w dla i-tego neuronu i j-tej wagi przy założonej stałej danej wartości sygnałów wejściowych pochodzących z danych uczących sieć.


zi(wij)

Wynika stąd zatem że wartość błędu wynika pośrednio od wartości poszczególnych współczynników wag:


E(yi(zi(wij)))

Zatem pochodną $\frac{\partial E}{\partial w_{\text{ij}}}$ można rozpisać następująco:


$$\frac{\partial E}{\partial w_{\text{ij}}} = \frac{\partial E}{\partial y_{i}}\ \bullet \ \frac{\partial y_{i}}{\partial z_{i}}\ \bullet \ \frac{\partial z_{i}}{\partial w_{\text{ij}}}$$

Pierwszą cześć możemy rozpisać następująco:


$$\frac{\partial E}{\partial y_{i}} = \ \frac{\partial}{\partial y_{i}}\left( \frac{1}{2}\left( y_{i} - \hat{y_{i}} \right)^{2} \right) = \frac{1}{2}\frac{\partial}{\partial y_{i}}\left( y_{i}^{2} - 2y_{i}\hat{y_{i}} + {\hat{y_{i}}}^{2} \right) = \frac{1}{2}\left\lbrack 2y_{i} - 2\hat{y_{i}} \right\rbrack = y_{i} - \hat{y_{i}}$$

Druga cześć jest pochodną funkcji aktywacji. Gdy funkcja aktywacji jest log–sigmoidalna to:


$$\frac{\partial y_{i}}{\partial z_{i}} = \left( 1 - y_{i} \right)y_{i}$$

Trzecią cześć możemy rozpisać następująco:


$$\frac{\partial z_{i}}{\partial w_{\text{ij}}} = \frac{\partial}{\partial w_{\text{ij}}}\left( w_{\text{ij}}x_{j} + b \right) = x_{j}$$

Tym samym rozpisując wzór:


$$w_{\text{ij}} = - \eta\frac{\partial E}{\partial w_{\text{ij}}} = - \eta\lbrack\left( y_{i} - \hat{y_{i}} \right)\left( 1 - y_{i} \right)y_{i}x_{j}\rbrack$$

Powyższe rozważania dotyczą tylko pojedynczej warstwy neuronów.

UCZENIE Z PRZYŚPIESZENIEM -jak już wiemy nasza sieć po podaniu danych uczących zacznie się uczyć. Podając dane uczące można sobie powiedzieć że sieć „kiedyś” się nauczy, ale z przyczyn formalnych nie może to trwać wieczność. Mimo że metoda wstecznej propagacji błędu jest bardzo czasochłonna uczenie daje się przyśpieszyć. W projekcie zostały użyte dwie metody:

Opiszę tu obie metody.

METODA ADAPTACYJNEGO WSPÓŁCZYNNIKA UCZENIA – jedna z metod zwiększających szybkość uczenia jest metoda adaptacyjnej korekty współczynnika η. Na podstawie porównania sumarycznego błędu kwadratowego(SSE- Sum Square Error)


$$\text{SSE}\left( t \right) = \sum_{i = 1}^{M}{(y_{i}\left( t \right) - {\hat{y}}_{i}(t))}^{2}$$

${\hat{y}}_{i}$-pożądany wektor sygnałów wyjściowych

W chwili uczenia t z jej poprzednią wartością SSE(t-1), sposób zmiany współczynnika uczenia η definiujemy jako:


$$n\left( t + 1 \right) = \begin{Bmatrix} \eta\left( t \right)\xi_{\text{d\ }}\text{\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ gdy\ SSE}\left( t \right) > er*SSE(t - 1) \\ \eta\left( t \right)\xi_{i}\text{\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ gdy\ SSE}\left( t \right) < SSE(t - 1) \\ \eta\left( t \right)\text{\ \ \ gdy\ SSE}\left( t - 1 \right) \leq SSE\left( t \right) \leq er*SSE(t - 1) \\ \end{Bmatrix}$$

ξd - współczynnik zmniejszania wartości η

ξi - współczynnik zwiększania wartości η

er - dopuszczalna krotność przyrostu błędu

Domyślne wartości tych parametrów a środowisku MATLAB:

ξd -0.7

ξi -1.05

er -1.04

Metoda Momentum - stosujemy ją w sytuacji gdy mamy mały współczynnik uczenia i mały gradient. W tego typu sytuacji zmniejszanie błędu następuje powoli. Jeśli jednak współczynnik uczenia i gradient są duże to występują silne oscylacje wokół minimum.

Zasada działania:

Metoda ta sama w sobie polega na wprowadzeniu do wzoru na korektę wag(wzór poniższy)


wij(t+1) =  wij(t) +  wij(t)

dodatkowego składnika który jest tak zwaną „miarą bezwładności” zmiany wag zwanego też „momentum”. Jeśli uczymy pod nadzorem pojedynczą warstwę sieci to reguła uczenia z metodą momentum wygląda tak:


$$w_{\text{ij}}\left( t + 1 \right) = w_{\text{ij}}\left( t \right) + \left( 1 - \eta \right)\left( {\hat{y}}_{i}\left( t \right) - y_{i}\left( t \right) \right)\frac{\partial y_{j}\left( t \right)}{\partial z_{j}}x_{i}\left( t \right) + \eta M_{\text{ij}}(t)$$

Momentum Mij(k) zaś wyliczamy z następującej zależności:


Mij(t) = wij(t) − wij(t − 1)

Współczynnik uczenia Momentum η∈ [0,1]. Jeśli η=1 to nowa waga jest równa ostatniej zmianie wagi. Jeśli η=0 to zmiana wagi opiera się jedynie na składowej gradientowej. Domyślna wartość współczynnika momentum to η=0.95. Współczynnik momentum znacznie wpływa na zwiększenie szybkości uczenia.

5.SKRYPT SIECI NEURONOWEJ

5.1 Przygotowanie środowiska

Przed samym wczytaniem i przygotowaniem danych należy odpowiednio przygotować środowisko MATLAB 4.0 do pracy. Czynimy to przy pomocy kilku linijek kodu:

clear all %czyszczenie wszystkich zmiennych, funkcji i linków MEX z

%workspace-a

format long %format obsługujący 15 cyfrowe zmienne double i

%7 cyfrowe single

format compact %format danych wyjściowych, brak enter

%przed ans=

5.2 Wczytanie danych uczących

Zestaw danych na podstawie którego sieć ma się uczyć zawiera 18 atrybutów. Pierwszy atrybut trzeba usunąć ponieważ znajduje się w nim jedynie przykładowy opis. Następnie tabelę trzeba podzielić na dwie części, w pierwszej będzie się znajdować 16 kolejnych atrybutów na podstawie których sieć będzie się uczyć, w drugiej części będzie się znajdował pojedynczy 17-sty atrybut klas do których będą przyporządkowywane zwierzęta w trakcie nauki. Pierwszy atrybut został usunięty ręcznie. Podział tabeli na dwie części odbywa się przez następujący kod:

load zoo2; %wczytanie danych z pliku

P= zoo2(:,1:16)'; %P-[R x Q] macierz wektorów wejściowych

T = zoo2(:,17)'; %T-[S x Q] macierz wektorów docelowych

Właśnie te dwie linijki sprawiły że nasza baza od teraz będzie się składać z dwóch macierzy, macierzy P która będzie stanowiła uniwersum wektorów wejściowych i macierzy T która będzie stanowiła uniwersum wektorów docelowych. Jednak zanim wykorzystamy nasze dane do nauki należy ją znormalizować.

Normalizacja polega na przekształceniu wartości atrybutów opisujących zwierzęta na przedział <0,1> dla których nauka sieci będzie przebiegać sprawnie i wydajnie. Dane zostały zaimportowane do arkusza kalkulacyjnego gdzie przeskalowano wartości nie mieszczące się w przedziale(w tym wypadku ilość nóg zwierzęcia) na wartości <0,1>. Atrybut wyjściowy stanowiący klasy do których algorytm przyporządkowywał zwierzęta pozostał niezmienny i znajduje się w przedziale <1,7>. Teraz nasza baza jest już gotowa aby przystąpić do nauki.

5.2 Kod programu

clear all %czyszczenie wszystkich zmiennych, funkcji i linków MEX

format long %format obsługujący 15 cyfrowe zmienne double i

7 cyfrowe single

format compact %format danych wyjściowych, brak enter przed ans=

load zoo2; %wczytanie pliku z danymi

P= zoo2(:,1:16)'; %wczytanie uniwersum wejściowego i podzielenie go

%na 16 kolumn

T = zoo2(:,17)'; %wczytanie uniwersum docelowego w formie 1 kolumny

[R,Q] = size(P); %size zwraca wymiar macierzy P

%[R,Q]=[kolumny, wiersze]

[S3,Q] = size(T); %size zwraca wymiar macierzy T

%[S3,Q]=[kolumny, wiersze]

S1 = 7; %liczba neuronów warstwy 1(130)

S2 = 2; %liczba neuronów warstwy 2(91)

disp_freq=100; %rozdzielczość wyświetlania

max_epoch=20000; %maksymalna ilość iteracji

err_goal=.25; %błąd docelowy

lr=.5; %wskaźnik uczenia

lr_inc=1.05;

lr_dec=0.7;

mc=0.9;

tp = [disp_freq , max_epoch , err_goal , lr ] ;

%zmienna pomocnicza określająca domyślne parametry uczenia dla funkcji trainbpx

%pozostałe domyślne parametry treningu:

%TP(5) – wzrost wskaźnika uczenia, domyślnie = 1.05.

%TP(6) – spadek wskaźnika uczenia, domyślnie = 0.7.

%TP(7) – stała momentum, domyślnie = 0.9.

%TP(8) – maksymalny stosunek błędu, domyślnie = 1.04.

[W1,B1,W2,B2,W3,B3] = initff(P,S1,'tansig',S2,'tansig',T,'purelin');

%losuje wstępne współczynniki neuronów

%inicjalizuje sieć jednokierunkową do 3 warstw

%tansig - funkcja przejścia tangens sigmoidalny

%purelin - liniowa funkcja przejścia

%Wi - waga macierzy na poszczególnych warstwach;

%Bi - kolumny wektorów przesunięć(bias) na poszczególnych warstwach

%P - macierz wektorów wejściowych

%Si - rozmiary poszczególnych warstw

%T - Sn x Q macierz wektorów docelowych

%feed forward - jednokierunkowe

[W1,B1,W2,B2,W3,B3,TE,TR] = trainbpx(W1,B1,'tansig',W2,B2,'tansig',W3,B3,'purelin',P,T,tp) ;

%funkcja ucząca(algorytmem wstecznej propagacji błędu z przyśpieszeniem metodą

adaptacyjnego współczynnika uczenia i metodą momentum)

%Argumenty wejściowe:

%Wi - waga macierzy dla poszczególnych warstw

%Bi – kolumna wektorów dla poszczególnych warstw

%TE - aktualny numer iteracji

%TR - rekord uczenia:[rząd błędu]

%Zwracane wartości:

%Wi - nowe wagi

%Bi - nowe wektory

%P - [RxQ] macierz wektorów wejściowych

%T - [SxQ] macierz wektorów docelowych

%Parametry domyślne:

%tp – domyślne parametry treningu

%TP(1) – epoch pomiędzy odświeżeniami ekranu, domyślnie = 25

%TP(2) – maksymalna ilość iteracji, domyślnie =1000

%TP(3) - suma błędu kwadratowego, domyślnie = 0.02

%TP(4) – wskaźnik uczenia, domyślnie 0.01

%TP(5) - wzrost wskaźnika uczenia, domyślnie = 1.05

%TP(6) - spadek wskaźnika uczenia, domyślnie = 0.7

%TP(7) – stała momentum, domyślnie = 0.9.

%TP(8) – maksymalny stosunek błędu, domyślnie = 1.04

A3 = simuff(P,W1,B1,'tansig',W2,B2,'tansig',W3,B3,'purelin') ;

%symuluje sieć jednokierunkową do 3 warstw

%P - macierz wektorów wejściowych

%Wi - macierz wag dla każdej warstwy

%Bi - wektor przesunięcia dla każdej warstwy

%Fi - funkcja transferu dla każdej warstwy

%Ai - wyjście dla każdej warstwy

[T' A3' (T-A3)' (abs(T-A3)>0.5)']

(1-sum(abs(T-A3)>0.5)/length(P))*100

%weryfikacja czy sieć się nauczyła na podstawie danych uczących

%abs - wartość bezwzględna

%demo trainbpx funkcja wywodząca się

Podany powyżej kod został przekształcony do postaci funkcji w środowisku MATLAB o nazwie MOJ_x podający następujące argumenty: S1, S2, mc, lr_inc, lr_dec, er który zwraca macierz wartości [procent epoch SSE]. Żeby stworzyć funkcję zakomentowałem inicjalizację S1 i S2, zwiększyłem disp_freq, i uzupełniłem tablicę tp o argumenty potrzebne do nauki trainbpx. Na końcu programu zwracane są: procent, epoch(ze zmiennej TE), SSE(ze zmiennej TR). Dodatkowo przygotowany kod zapisywał wyniki pracy programu na bieżąco.

clear all % czyszczenie szystkich zmiennych

format long % 15 cyfr double i 7 single

format compact

S1_max=101;

S1_min=1;

ile_razy_lr=4;

ile_eksperymentow=2;

ile_wszystkich=0;

for S1 = S1_min: 10 : S1_max, % 101

for S2 = 1: 10 : S1,

for lr_inc = 1.03 : 0.02 : 1.07,

for lr_dec = 0.5 : 0.2 : 0.9,

for er = 1.01 : 0.03 : 1.07,

for mc = 0.6 : 0.3 : 0.99,

for eksperyment = 1 : 1 : ile_eksperymentow,

ile_wszystkich=ile_wszystkich+1;

end

end

end

end

end

end

end

mc=0.90;

wiersz=1;

for S1 = S1_min: 10 : S1_max, % 101

for S2 = 1: 10 : S1,

for lr_inc = 1.03 : 0.02 : 1.07,

for lr_dec = 0.5 : 0.2 : 0.9,

for er = 1.01 : 0.03 : 1.07,

for mc = 0.3 : 0.3 : 0.99

for eksperyment = 1 : 1 : ile_eksperymentow, %10

[procent, epoch, SSE] = moj_x(S1, S2, lr_inc, lr_dec, er, mc);

wynik( wiersz , 1) = S1;

wynik( wiersz , 2) = S2;

wynik( wiersz , 3) = lr_inc;

wynik( wiersz , 4) = lr_dec;

wynik( wiersz , 5) = er;

wynik( wiersz , 6) = eksperyment;

wynik( wiersz , 7) = procent;

wynik( wiersz , 8) = epoch;

wynik( wiersz , 9) = SSE;

fprintf('\nJest na %i/%i = %3.2f%% \nS1 = %i S2 = %i lr_inc = %i lr_dec = %i er = %i , eks = %i\n\n',wiersz,ile_wszystkich,(wiersz/ile_wszystkich*100),S1, S2, lr_inc, lr_dec, er, eksperyment);

end wiersz = wiersz + 1;

end

end

end

end

end

disp('zapis!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!');

save do_teraz.txt wynik -ascii;

str_liczba1 = num2str(S1);

str_liczba2 = num2str(S2);

spacja = '_';

koncowka = '.txt';

nazwa_koncowa = [str_liczba1 spacja str_liczba2 koncowka]

kodowanie = '-ascii';

save(nazwa_koncowa, 'wynik', kodowanie);

end

end

save wyniczek.txt wynik -ascii;

Przejdźmy teraz do przeanalizowania eksperymentów.

6.EKSPERYMENTY

Głównym celem dla którego przeprowadzono eksperymenty było ustalenie parametrów sieci i zbadanie dla jakich sieć uczy się najskuteczniej. Przebadany został wpływ liczby neuronów na poszczególnych warstwach na szybkość i skuteczność uczenia się sieci. Wraz z ilością neuronów zmieniane były też inne wartości takie jak stała momentum(mc), wzrost wskaźnika uczenia(lr_inc), spadek wskaźnika uczenia(lr_dec), maksymalny stosunek błędu(er).

TABELA 100 NAJLEPSZYCH WYNIKÓW OSIĄGNIĘTYCH W CZASIE EKSPERYMENTU

S1 S2 lr_inc lr_dec er mc eksperyment % epoch SSE
91,000 21,000 1,030 0,700 1,010 0,900 2,000 100,000 154,000 0,246
81,000 11,000 1,030 0,700 1,040 0,900 2,000 100,000 161,000 0,233
101,000 11,000 1,030 0,500 1,040 0,900 2,000 100,000 161,000 0,235
91,000 31,000 1,030 0,500 1,070 0,900 1,000 100,000 166,000 0,244
81,000 61,000 1,030 0,500 1,070 0,900 1,000 100,000 169,000 0,237
91,000 21,000 1,030 0,500 1,010 0,900 2,000 100,000 175,000 0,239
81,000 11,000 1,030 0,500 1,070 0,900 1,000 100,000 177,000 0,249
101,000 11,000 1,030 0,900 1,040 0,900 1,000 100,000 179,000 0,243
91,000 21,000 1,030 0,500 1,040 0,900 1,000 100,000 180,000 0,235
71,000 11,000 1,030 0,700 1,010 0,900 2,000 100,000 182,000 0,248
91,000 21,000 1,030 0,700 1,070 0,900 1,000 100,000 183,000 0,248
61,000 21,000 1,030 0,700 1,010 0,900 2,000 100,000 185,000 0,250
101,000 21,000 1,030 0,500 1,070 0,900 2,000 100,000 186,000 0,246
101,000 31,000 1,030 0,700 1,040 0,900 1,000 100,000 188,000 0,245
91,000 21,000 1,030 0,700 1,040 0,900 1,000 100,000 194,000 0,250
91,000 11,000 1,030 0,900 1,040 0,900 1,000 100,000 196,000 0,237
101,000 11,000 1,050 0,700 1,010 0,900 1,000 100,000 197,000 0,243
101,000 11,000 1,050 0,700 1,070 0,900 1,000 100,000 197,000 0,247
101,000 11,000 1,050 0,500 1,070 0,900 2,000 100,000 199,000 0,247
81,000 21,000 1,030 0,900 1,040 0,900 2,000 100,000 201,000 0,240
81,000 11,000 1,030 0,500 1,040 0,600 2,000 100,000 201,000 0,247
101,000 11,000 1,030 0,900 1,070 0,900 2,000 100,000 202,000 0,235
51,000 41,000 1,030 0,900 1,070 0,900 2,000 100,000 202,000 0,244
81,000 11,000 1,030 0,900 1,040 0,900 1,000 100,000 204,000 0,235
101,000 21,000 1,050 0,700 1,070 0,900 2,000 100,000 204,000 0,245
91,000 31,000 1,050 0,500 1,010 0,900 1,000 100,000 205,000 0,242
71,000 11,000 1,050 0,700 1,010 0,900 2,000 100,000 206,000 0,240
61,000 41,000 1,030 0,900 1,040 0,900 1,000 100,000 207,000 0,243
91,000 21,000 1,050 0,700 1,040 0,900 2,000 100,000 210,000 0,245
71,000 11,000 1,070 0,700 1,070 0,600 2,000 100,000 211,000 0,247
91,000 31,000 1,050 0,700 1,040 0,900 2,000 100,000 212,000 0,250
101,000 21,000 1,030 0,900 1,010 0,900 2,000 100,000 213,000 0,248
101,000 61,000 1,050 0,700 1,070 0,900 2,000 100,000 214,000 0,241
91,000 11,000 1,050 0,700 1,040 0,900 2,000 100,000 216,000 0,238
101,000 11,000 1,050 0,500 1,040 0,900 1,000 100,000 216,000 0,244
81,000 11,000 1,050 0,500 1,070 0,900 2,000 100,000 216,000 0,245
61,000 61,000 1,050 0,500 1,040 0,900 2,000 100,000 216,000 0,249
101,000 21,000 1,050 0,700 1,010 0,900 1,000 100,000 218,000 0,241
101,000 21,000 1,030 0,700 1,010 0,600 2,000 100,000 219,000 0,248
61,000 21,000 1,030 0,500 1,070 0,900 1,000 100,000 219,000 0,250
91,000 91,000 1,050 0,700 1,070 0,900 1,000 100,000 222,000 0,246
101,000 11,000 1,050 0,500 1,070 0,600 1,000 100,000 223,000 0,247
91,000 11,000 1,030 0,700 1,010 0,900 1,000 100,000 223,000 0,250
71,000 11,000 1,050 0,700 1,070 0,900 2,000 100,000 226,000 0,247
101,000 21,000 1,050 0,700 1,040 0,900 2,000 100,000 227,000 0,247
71,000 71,000 1,030 0,900 1,010 0,900 1,000 100,000 228,000 0,238
61,000 21,000 1,070 0,700 1,010 0,900 1,000 100,000 228,000 0,245
81,000 11,000 1,070 0,700 1,070 0,900 2,000 100,000 230,000 0,248
61,000 11,000 1,050 0,500 1,010 0,900 1,000 100,000 232,000 0,243
81,000 21,000 1,050 0,500 1,010 0,600 1,000 100,000 232,000 0,250
101,000 21,000 1,070 0,900 1,070 0,900 1,000 100,000 234,000 0,249
71,000 21,000 1,030 0,500 1,010 0,900 2,000 100,000 234,000 0,249
101,000 21,000 1,070 0,900 1,070 0,900 2,000 100,000 235,000 0,235
91,000 11,000 1,050 0,700 1,010 0,900 1,000 100,000 235,000 0,240
61,000 21,000 1,030 0,700 1,040 0,900 2,000 100,000 236,000 0,250
101,000 41,000 1,050 0,500 1,070 0,900 2,000 100,000 237,000 0,246
91,000 21,000 1,030 0,500 1,070 0,600 2,000 100,000 237,000 0,250
51,000 11,000 1,070 0,500 1,070 0,900 1,000 100,000 238,000 0,248
91,000 31,000 1,050 0,700 1,070 0,900 1,000 100,000 239,000 0,246
101,000 11,000 1,050 0,700 1,040 0,600 2,000 100,000 239,000 0,246
101,000 21,000 1,050 0,700 1,070 0,900 1,000 100,000 242,000 0,245
81,000 21,000 1,030 0,900 1,010 0,900 1,000 100,000 244,000 0,247
91,000 71,000 1,030 0,500 1,070 0,900 1,000 100,000 244,000 0,250
101,000 11,000 1,050 0,700 1,010 0,900 2,000 100,000 245,000 0,250
91,000 11,000 1,050 0,900 1,010 0,900 1,000 100,000 246,000 0,242
51,000 21,000 1,050 0,500 1,010 0,900 1,000 100,000 246,000 0,246
61,000 21,000 1,070 0,500 1,010 0,900 2,000 100,000 247,000 0,244
81,000 21,000 1,030 0,700 1,070 0,900 2,000 100,000 248,000 0,249
101,000 21,000 1,070 0,700 1,010 0,900 1,000 100,000 250,000 0,243
51,000 21,000 1,030 0,900 1,040 0,900 1,000 100,000 250,000 0,244
101,000 21,000 1,070 0,500 1,010 0,900 2,000 100,000 251,000 0,245
91,000 61,000 1,070 0,500 1,010 0,900 2,000 100,000 251,000 0,245
101,000 11,000 1,070 0,500 1,010 0,900 1,000 100,000 251,000 0,249
101,000 21,000 1,070 0,500 1,070 0,900 2,000 100,000 252,000 0,243
91,000 21,000 1,070 0,500 1,070 0,900 1,000 100,000 256,000 0,243
81,000 11,000 1,050 0,700 1,070 0,600 1,000 100,000 257,000 0,249
101,000 101,000 1,030 0,700 1,040 0,900 1,000 100,000 258,000 0,249
81,000 11,000 1,070 0,700 1,040 0,900 2,000 100,000 259,000 0,243
101,000 31,000 1,030 0,500 1,040 0,900 2,000 100,000 260,000 0,249
71,000 61,000 1,030 0,700 1,040 0,900 2,000 100,000 260,000 0,250
51,000 41,000 1,050 0,700 1,040 0,900 1,000 100,000 260,000 0,250
101,000 11,000 1,070 0,700 1,070 0,900 1,000 100,000 262,000 0,248
101,000 21,000 1,030 0,700 1,010 0,900 1,000 100,000 262,000 0,248
51,000 21,000 1,030 0,700 1,040 0,900 1,000 100,000 262,000 0,249
41,000 11,000 1,030 0,500 1,070 0,900 1,000 100,000 264,000 0,249
71,000 21,000 1,030 0,700 1,070 0,600 2,000 100,000 265,000 0,248
101,000 21,000 1,030 0,500 1,010 0,900 2,000 100,000 266,000 0,249
71,000 51,000 1,030 0,700 1,010 0,900 2,000 100,000 266,000 0,249
81,000 21,000 1,050 0,900 1,010 0,900 1,000 100,000 267,000 0,239
51,000 31,000 1,050 0,900 1,040 0,900 2,000 100,000 267,000 0,247
91,000 11,000 1,050 0,700 1,010 0,900 2,000 100,000 268,000 0,249
41,000 21,000 1,030 0,700 1,070 0,900 2,000 100,000 268,000 0,250
61,000 11,000 1,050 0,700 1,040 0,900 2,000 100,000 269,000 0,249
81,000 21,000 1,070 0,500 1,040 0,600 1,000 100,000 270,000 0,247
91,000 41,000 1,030 0,900 1,070 0,900 1,000 100,000 271,000 0,249
91,000 21,000 1,050 0,900 1,010 0,900 2,000 100,000 272,000 0,246
71,000 11,000 1,050 0,700 1,010 0,600 1,000 100,000 272,000 0,250
41,000 21,000 1,030 0,900 1,040 0,900 2,000 100,000 273,000 0,250
101,000 21,000 1,050 0,700 1,040 0,900 1,000 100,000 274,000 0,249
91,000 31,000 1,030 0,700 1,010 0,900 1,000 100,000 274,000 0,250

Wyniki zostały posortowane według następujących kryteriów:

-% nauczenia się sieci – malejąco

-epoch - rosnąco

-SSE – rosnąco

Dla 100 najlepszych wyników sprawdziłem jakie ilości neuronów w poszczególnych warstwach występowały najczęściej, oto wyniki

Liczba neuronów ilość przypadków
S1=101 32
S1=91 24
S1=81 15
S1=71 10
S1=61 9
S1=51 7
Liczba neuronów ilość przypadków
S2=1 0
S2=11 35
S2=21 42
S2=31 8
S2=41 5
S2=51 1

Jak widać najczęściej występowały przypadki w których S1= 101, zaś S2 = 21.

Średnia wartość epoch dla 100 najlepszych wyników to 228,45. Średni SSE to 0,24549. Aż 89 wyników z listy 100 najlepszych posiada współczynnik momentum równy 0,9 co świadczy o jego dużym znaczeniu dla szybkości obliczeń. Zaledwie 11 wyników posiada współczynnik momentum równy 0,6. Wśród 100 najlepszych wyników współczynnik lr_inc występuje w następującej ilości przypadków:

  ilość przypadków
lr inc=1,03 47
lr inc=1,05 37
lr inc=1,07 16

Współczynnik lr_dec zaś występuje w następujących ilościach:

  ilość przypadków
lr dec=0,9 19
lr dec=0,7 48
lr dec=0,5 33

Powyższe statystyki dotyczą zestawu TOP 100.

Zobaczmy teraz ogólne statystyki dotyczące wszystkich wyników. W wyniku przeprowadzonych eksperymentów otrzymano w sumie 7128 rekordów danych. Dla 58,165% przypadków sieć nauczyła się w 100%, dla 36,153% przypadków sieć nie nauczyła się w ogóle(0%). Średnie epoch dla całego zbioru to 5001,665. Średni % w jakim nauczyła się sieć w odniesieniu do otrzymanego zbioru to 61,556%. Średnia wartość SSE była niemożliwa do obliczenia ponieważ maksymalna wartość jaką przyjmuje SSE to nieskończoność. Odnośnie występowania różnych wartości S1 i S2 sporządziłem dwie tabelki obrazujące najczęściej występujące wartości:

Liczba neuronów ilość przypadków Liczba neuronów ilość przypadków
S1=101 1188 S2=1 1188
S1=91 1080 S2=11 1080
S1=81 972 S2=21 972
S1=71 864 S2=31 864
S1=61 756 S2=41 756
S1=51 648 S2=51 648

Dołączam też wykresy obrazujące zależności % nauczenia się, SSE i er od liczby neuronów.

% NAUCZENIA SIĘ SIECI W ZALEŻNOŚCI OD ILOŚCI NEURONÓW NA WARSTWACH

Jak widać w miarę przyrostu liczby neuronów sieć uczyła się coraz skuteczniej co widać wyraźnie po płaszczyźnie jaka została utworzona.

WYKRES ZALEŻNOŚCI EPOCH OD ILOŚCI NEURONÓW NA WARSTWACH

Jak widać im mniej neuronów na obu warstwach tym sieć gorzej radzi sobie z uczeniem, jeśli zaś ilości neuronów na obu warstwach są zbliżone to sieć uczy się bardzo skutecznie co widać po bardzo spłaszczonej płaszczyźnie.

WYKRES ZALEŻNOŚCI SSE OD ILOŚCI NEURONÓW NA WARSTWACH

Już najpierwszy rzut oka coś jest nie tak. Otóż wartości SSE osiągają nieskończoność przez co wykres jest niemal idealnie płaski. Sporo wartości SSE to bardzo duże liczby które powodują ustawianie przez środowisko bardzo niesprzyjającej skali która wypłaszcza nam wykres.

7.Wnioski i podsumowanie

Celem projektu było przetestowanie działania wielowarstwowej sztucznej sieci neuronowej mającej za zadanie rozpoznawać zwierzęta na podstawie podanych cech. W tym celu wykorzystana została funkcja trainbpx z pakietu MATLAB 4.0 . Dane uczące zostały pobrane z repozytorium uniwersytetu Kalifornijskiego w Irvine.

Zanim przystąpiono do badań dane musiały zostać znormalizowane. Gdy to już nastąpiło można było przystąpić do badań.

Pomiary były wykonywane dla następujących wartości:

dla podanych wyżej wartości wykonane zostały 2 eksperymenty. Najlepszy wynik został osiągnięty dla S1=91, S2=21, lr_inc=1,03, lr_dec=0,7, er=1,01, mc=0,9. Podczas badań można było zauważyć, że stała momentum ma znaczny wpływ na szybkość uczenia co widać przy 100 najlepszych wynikach z których większa część posiada wyższy współczynnik momentum równy 0,9. Można było zaobserwować, że w miarę zwiększania liczby neuronów na warstwach sieć uczy się skuteczniej i częściej osiąga zamierzony poziom nauczenia równy 100%. Sieć z dobrze dobranymi parametrami potrafi uczyć się bardzo szybko i wydajnie a co za tym idzie potrafi w krótkim czasie nauczyć się zadanego zbioru danych.

Obecnie sieci neuronowe znajdują coraz więcej zastosowań, oprócz rozpoznawana zwierząt mogą one rozpoznawać jakiekolwiek zadane obiekty na podstawie posiadanej bazy danych. Popularność sieci bierze się z ich możliwości uogólniania wiedzy i uczenia się nawet przy niekompletnych danych.

Bibliografia:

http://www.kik.pcz.czest.pl/nn/jednokier.php?art=4

http://www.ftj.agh.edu.pl/~stegowski/dydaktyka/neurony/OPISNT.htm#trainbpx

http://wikipedia.pl

Marek Kasperski – Sztuczna inteligencja

Metody i techniki sztucznej inteligencji - Rutkowski Leszek

http://galaxy.agh.edu.pl/~vlsi/AI/koho_t/

Sztuczna inteligencja - Marek Jan Kasperski


  1. Interdyscyplinarność- wielodziedzinowość

  2. Generalizacja – uogólnianie, rozszerzanie


Wyszukiwarka

Podobne podstrony:
learnbp rozpoznawianie zwierza Nieznany
rozpoznawanie rui u zwierzat, weterynaria, I semestr, Choroby zwierząt
09 Rozpoznawanie i zwalczanie chorób zwierząt
10 Metody otrzymywania zwierzat transgenicznychid 10950 ppt
Ślady bytowania Zwierząt w Terenie
Czynności kontrolno rozpoznawcze w zakresie nadzoru nad przestrzeganiem przepisów
Zwierzęta Polski
Pojęcie i istota rozpoznania wojskowego
zwierzęta spotykane w lesie
rozpoznanie pożaru
W5 Rozpoznawanie 2010
2 Etyka a badania na zwierz Ľtachid 20330 ppt
zwierzęta 3 2
niewydolność rozpoznawanie
2 Rozpoznawanie wczesnej ciążyid 19813 PPT
model opieki nad pacjentem z rozpoznana nerwica

więcej podobnych podstron