Πραγματοποίηση Νευρωνικών Δικτύων με το Matlab
Το MATLAB μας δίνει την δυνατότητα να εργαστούμε στα με 4 τρόπους: Στο 1 ο επίπεδο με τον GUI. Μπορούμε με σχετική ευκολία να χρησιμοποιήσουμε τις εργαλειοθήκες (toolbox) για την επίλυση προβλημάτων προσαρμογής καμπυλών, αναγνώρισης δεδομένων, ταξινόμησης και ανάλυσης χρονοσειρών. Στο 2 ο επίπεδο, μπορούν να χρησιμοποιηθούν οι εντολές του MATLAB και να γραφεί script που θα δημιουργεί το ΝΝ, θα το εκπαιδεύει, κ.λ.π. Σημείωση: Οι εντολές στο Matlab μπορεί να διαφέρουν ελαφρώς από έκδοση σε έκδοση. Οι δυνατότητες του MATLAB
Οι δυνατότητες του MATLAB Στο 3 ο επίπεδο μπορούμε να προσαρμόσουμε τα toolbox, δημιουργώντας έτσι τα δικά μας νευρωνικά δίκτυα διατηρώντας παράλληλα όλη την λειτουργικότητα των toolbox. Στο 4 ο επίπεδο μπορούμε να μετατρέψουμε τον κώδικα των αρχείων που υπάρχει στα αρχεία των toolbox, καθώς οι κώδικες είναι προσβάσιμοι. Το Matlab (ανάλογα και με την έκδοσή του) μας δίνει την δυνατότητα μελέτης παραδειγμάτων διαφόρων ειδών ΝΝ σε διάφορες εφαρμογές.
Οι δυνατότητες του MATLAB
Οι δυνατότητες του MATLAB >> nprtool
Οι δυνατότητες του MATLAB
Οι δυνατότητες του MATLAB
Οι δυνατότητες του MATLAB
Οι δυνατότητες του MATLAB
Οι δυνατότητες του MATLAB
Οι δυνατότητες του MATLAB
Οι δυνατότητες του MATLAB
Οι δυνατότητες του MATLAB
Οι δυνατότητες του MATLAB
Οι δυνατότητες του MATLAB
Το Matlab έχει ορισμένα έτοιμα παραδείγματα που αναφέρονται στο βιβλίο Neural Network Design (Hagan, Demuth, Beale): >> nndtoc Οι δυνατότητες του MATLAB
To GUI του MATLAB Το GUI ξεκινάει με την εντολή στην επιφάνεια εργασίας: >> nntool
To GUI του MATLAB Μπορούμε να δημιουργήσουμε ένα νέο ΝΝ, να ορίσουμε τα χαρακτηριστικά στοιχεία του ΝΝ (Training function, Adaption learning function, κ.λ.π.,) όπως εμφανίζονται στην εικόνα.
To GUI του MATLAB Να εισάγουμε τα δεδομένα εισόδου, τους στόχους και άλλα στοιχεία (ανάλογα με το ΝΝ). H Εισαγωγή των δεδομένων (ανυσμάτων) μπορεί να γίνει και από τον Neural Network/Data Manager (nntool)
Θέλουμε να δημιουργήσουμε ένα ΝΝ Perceptron που θα κάνει γραμμικό διαχωρισμό δύο κλάσεων οι οποίες έχουν από 20 δεδομένα η κάθε μία και τα έχουμε δημιουργήσει από πριν με το Matlab: close all, clear all, clc, format compact N = 20; % number of samples of each class % define inputs and outputs offset = 5; % offset for second class x = [randn(2,n) randn(2,n)+offset]; % inputs y = [zeros(1,n) ones(1,n)]; % outputs % Plot input samples with PLOTPV (Plot perceptron input/target vectors) figure(1) plotpv(x,y); grid on; Δημιουργία δικτύου Perceptron
Δημιουργία δικτύου Perceptron Δημιουργεί ένα άνυσμα x με διαστάσεις (2x40), σε δύο περιοχές που απέχουν μεταξύ τους κατά το offset και έχουν την standard normal distribution και ένα άνυσμα y (1x40) με 20 (0) και 20 (1).
Δημιουργία δικτύου Perceptron Δημιουργούνται 2 νέφη με 20 δεδομένα το καθένα (ο, +) στην ευρύτερη περιοχή με τυχαιότητα
Δημιουργία δικτύου Perceptron net = perceptron; net = train(net,x,y); view(net); figure(1) plotpc(net.iw{1},net.b{1});
Δημιουργία δικτύου Perceptron
Δημιουργία δικτύου Perceptron
Δημιουργία δικτύου Perceptron
Δημιουργία δικτύου Perceptron To Matlab συμβολίζει τα δεδομένα εισόδου με το γράμμα (P) (εκ του Patterns). Έτσι οι συντεταγμένες των δεδομένων εισόδου που δημιουργήσαμε (ανύσματα 2x1) θα είναι P 1 και P 2. Οι στόχοι (Targets) θα είναι οι επιθυμητές τιμές εξόδου του ΝΝ για κάθε δεδομένο εισόδου (0 για την μία κλάση και 1 για την άλλη). Μπορούμε να τα εισάγουμε (Import) στο ΝΝ και από τον Neural Network/Data Manager (nntool) δίνοντάς τους και το όνομα που θέλουμε. Στο παράδειγμά μας, ήδη από την δημιουργία τους, τα ονομάσαμε X και Y.
Δημιουργία δικτύου Perceptron
Δημιουργία δικτύου Perceptron
Δημιουργία δικτύου Perceptron Τώρα μπορούμε να δημιουργήσουμε το ΝΝ, ορίζοντας τα στοιχεία του: Name Network Type Input Data Target Data Transfer function Learning function
Δημιουργία δικτύου Perceptron
Δημιουργία δικτύου Perceptron To NN Perceptron έχει 2 εισόδους, 1 έξοδο και 1 νευρώνα με βηματική συνάρτηση ενεργοποίησης.
Δημιουργία δικτύου Perceptron
Δημιουργία δικτύου Perceptron
Δημιουργία δικτύου Perceptron
Δημιουργία δικτύου Perceptron
Δημιουργία δικτύου Perceptron Μετά το πέρας της εκπαίδευσης, τo NN Perceptron έχει ξεχωρίσει τις δύο κλάσεις και είναι σε θέση να χαράξει την ευθεία που τις χωρίζει. Εάν δούμε στο Neural Network/Data Manager (nntool) τα Output Data και Error Data θα διαπιστώσουμε πως η ταξινόμηση γίνεται σωστά. Η εν λόγω ευθεία (εάν ξαναεκπαιδεύσουμε το ΝΝ) μπορεί να είναι ελαφρώς διαφορετική καθώς παίζει ρόλο η αρχική τυχαιότητα των βαρών του ΝΝ. Εάν δε ξαναδημιουργήσουμε τα δεδομένα εισόδου, τότε λόγω της τυχαιότητας των δεδομένων, θα είναι σίγουρα διαφορετική, αλλά βέβαια θα εξακολουθεί να ξεχωρίζει τις κλάσεις.
Δημιουργία δικτύου Perceptron
Δημιουργία δικτύου Multi Layer Perceptron (MLP) Θα δημιουργήσουμε ένα MLP με το οποίο θα αποπειραθούμε να ταξινομήσουμε τα δεδομένα τεσσάρων (4) κλάσεων, τα οποία θα δημιουργήσουμε προηγουμένως στο Matlab: close all, clear all, clc, format compact % number of samples of each class K = 100; % define 4 clusters of input data q =.6; % offset of classes A = [rand(1,k)-q; rand(1,k)+q]; B = [rand(1,k)+q; rand(1,k)+q]; C = [rand(1,k)+q; rand(1,k)-q]; D = [rand(1,k)-q; rand(1,k)-q]; grid on
Δημιουργία δικτύου Multi Layer Perceptron (MLP) % plot clusters figure(1) plot(a(1,:),a(2,:),'+k') hold on plot(b(1,:),b(2,:),'b*') plot(c(1,:),c(2,:),'ro') plot(d(1,:),d(2,:),'m.','markersize',15) % text labels for clusters text(.3-q,.6+2*q,'class A','FontSize',14) text(.3+q,.6+2*q,'class B','FontSize',14) text(.3+q,.4-2*q,'class C','FontSize',14) text(.3-q,.4-2*q,'class D','FontSize',14) Το script θα δημιουργήσει 4 κλάσεις με 100 πρότυπα η κάθε μία:
Δημιουργία δικτύου Multi Layer Perceptron (MLP)
Δημιουργία δικτύου Multi Layer Perceptron (MLP) % coding (+1/-1) of 4 separate classes a = [-1-1 -1 +1]'; b = [-1-1 +1-1]'; d = [-1 +1-1 -1]'; c = [+1-1 -1-1]'; % define inputs (combine samples from all four classes) P = [A B C D]; % define targets T = [repmat(a,1,length(a)) repmat(b,1,length(b))... repmat(c,1,length(c)) repmat(d,1,length(d)) ]; Κωδικοποιούμε τις εξόδους των 4 κλάσεων με +1/-1 και δημιουργούμε τα δεδομένα εισόδου Ρ και τους στόχους Τ που θα δώσουμε στο ΝΝ.
Δημιουργία δικτύου Multi Layer Perceptron (MLP) % create a neural network net = feedforwardnet([4 3]); % train net net.divideparam.trainratio = 1; % training set [%] net.divideparam.valratio = 0; % validation set [%] net.divideparam.testratio = 0; % test set [%] % train a neural network [net,tr,y,e] = train(net,p,t); % show network view(net) Δημιουργούμε το ΝΝ, δίνουμε τα χαρακτηριστικά του, το εκπαιδεύουμε και το εμφανίζουμε.
Δημιουργία δικτύου Multi Layer Perceptron (MLP)
Υπολογίζουμε την επίδοση του ΝΝ, που δείχνει την % επιτυχία του ΝΝ στην ταξινόμηση των δεδομένων εισόδου. % evaluate performance: decoding network response [m,i] = max(t); % target class [m,j] = max(y); % predicted class N = length(y); % number of all samples k = 0; % number of missclassified samples if find(i-j), % if there exist missclassified samples end Δημιουργία δικτύου Multi Layer Perceptron (MLP) k = length(find(i-j)); % get a number of missclassified samples fprintf('correct classified samples: %.1f%% samples\n', 100*(N-k)/N) Correct classified samples: 100.0% samples
Δημιουργία δικτύου Multi Layer Perceptron (MLP)
Δημιουργία δικτύου Multi Layer Perceptron (MLP)
Δημιουργία δικτύου Multi Layer Perceptron (MLP) Δίνουμε την γραφική αποτύπωση των στόχων και των εξόδων. % plot network output figure; subplot(211) plot(t') title('targets') ylim([-2 2]) grid on subplot(212) plot(y') title('network response') xlabel('# sample') ylim([-2 2]) grid on
Δημιουργία δικτύου Multi Layer Perceptron (MLP)
Δημιουργία δικτύου Multi Layer Perceptron (MLP) Δίνουμε την γραφική αποτύπωση του διαχωρισμού των 4 κλάσεων. % generate a grid span = -1:.01:2; [P1,P2] = meshgrid(span,span); pp = [P1(:) P2(:)]'; % simualte neural network on a grid aa = net(pp); % plot classification regions based on MAX activation figure(1) m = mesh(p1,p2,reshape(aa(1,:),length(span),length(span))-5); set(m,'facecolor',[1 1 1],'linestyle','none'); hold on m = mesh(p1,p2,reshape(aa(2,:),length(span),length(span))-5); set(m,'facecolor',[1 1.0 0.5],'linestyle','none'); m = mesh(p1,p2,reshape(aa(3,:),length(span),length(span))-5); set(m,'facecolor',[.4 1.0 0.9],'linestyle','none'); m = mesh(p1,p2,reshape(aa(4,:),length(span),length(span))-5); set(m,'facecolor',[.3.4.5],'linestyle','none'); view(2)
Δημιουργία δικτύου Multi Layer Perceptron (MLP)
Δημιουργία δικτύου Multi Layer Perceptron (MLP)
Δημιουργία δικτύου Multi Layer Perceptron (MLP) Δημιουργία του ΝΝ από το Neural Network/Data Manager (nntool)
Δημιουργία δικτύου Multi Layer Perceptron (MLP)
Δημιουργία δικτύου Multi Layer Perceptron (MLP)
Δημιουργία δικτύου Multi Layer Perceptron (MLP)
Δημιουργία δικτύου Multi Layer Perceptron (MLP)
Δημιουργία δικτύου Multi Layer Perceptron (MLP)
Δημιουργία δικτύου Multi Layer Perceptron (MLP)
Δημιουργία δικτύου Multi Layer Perceptron (MLP) Μπορούμε να κάνουμε το ίδιο τεστ τροφοδοτώντας το εκπαιδευμένο ΝΝ με όλα τα σημεία της επιφάνειας (-1 2, - 1 2), όπως κάναμε προηγουμένως. Για να γίνει αυτό θα τροφοδοτήσουμε το ΝΝ με το αρχείο data pp και θα κάνουμε simulation:
Δημιουργία δικτύου Multi Layer Perceptron (MLP) Θα αποτυπώσουμε τις εξόδους mlp_outputs που παίρνουμε από την εξομοίωση: % generate a grid span = -1:.01:2; [P1,P2] = meshgrid(span,span); pp = [P1(:) P2(:)]'; figure(1) m = mesh(p1,p2,reshape(mlp_outputs(1,:),length(span),length(span))-5); set(m,'facecolor',[1 1 1],'linestyle','none'); hold on m = mesh(p1,p2,reshape(mlp_outputs(2,:),length(span),length(span))-5); set(m,'facecolor',[1 1.0 0.5],'linestyle','none'); m = mesh(p1,p2,reshape(mlp_outputs(3,:),length(span),length(span))-5); set(m,'facecolor',[.4 1.0 0.9],'linestyle','none'); m = mesh(p1,p2,reshape(mlp_outputs(4,:),length(span),length(span))-5); set(m,'facecolor',[.3.4.5],'linestyle','none'); view(2)
Δημιουργία δικτύου Multi Layer Perceptron (MLP)
Δημιουργία δικτύου Multi Layer Perceptron (MLP)
Δημιουργία δικτύου Multi Layer Perceptron (MLP) Το ΝΝ διαχωρίζει όλα τα σημεία του επιπέδου σε 4 κλάσεις (ανάλογα με τα χρώματα), αντιστοιχίζοντας σε κάθε κλάση μια περιοχή, με όλα της τα σημεία. Στα όρια των κλάσεων υπάρχουν κάποια σημεία του επιπέδου που αντιστοιχίζονται σε λάθος κλάσεις (τίποτα δεν είναι τέλειο). Αυτό συμβαίνει είτε πραγματοποιήσουμε το ΝΝ με τον έναν είτε με τον άλλο τρόπο. Για να το δούμε πρέπει να κάνουμε zoom στα όρια των κλάσεων.
Δημιουργία δικτύου ADALINE Τα δίκτυα Adaline, όπως και το Perceptron, μπορούν να διαχωρίσουν μόνον κλάσεις γραμμικά διαχωρίσιμες, πράγμα που όπως είναι φυσικό- περιορίζει την χρήση τους. Παρ όλα αυτά τα Adaline χρησιμοποιούνται ευρέως -και κυρίως- στα προσαρμοστικά φίλτρα (adaptive filters). Για την χρήση τους στα προσαρμοστικά φίλτρα γίνεται μια προσαρμογή στις εισόδους Adaline που επιτρέπει χρονοκαθυστερήσεις TDL (Tapped Delay Line): Σημείωση: Χρησιμοποιούμε τους συμβολισμούς του Matlab.
Δημιουργία δικτύου ADALINE y k TDL με R εξόδους: p 1 k = y k D D D p 2 k = y k 1 p R k = y k R + 1 Το σήμα εξόδου του TDL είναι ένα άνυσμα με διαστάσεις Rx1, όπου έχουμε την τιμή του σήματος στο τρέχον χρονικό διάστημα και τις προηγούμενες R-1 τιμές του. Εάν συνδυάσουμε την γραμμή TDL με το Adaline μπορούμε να δημιουργήσουμε ένα προσαρμοστικό φίλτρο:
Δημιουργία δικτύου ADALINE Είσοδοι ADALINE y k D w 1,1 D w 1,2 Σ n k a k b D w 1,R 1 a k = purelin Wp k + b = R i=1 w 1,i y k i + 1 + b
Δημιουργία δικτύου ADALINE Δημιουργία ΝΝ για προσαρμοστική πρόβλεψη χρονοσειρών (σημάτων δηλαδή), με βάση τις προηγούμενες τιμές τους: close all, clear all, clc, format compact % define segments of time vector dt = 0.01; % time step [seconds] t1 = 0 : dt : 3; % first time vector [seconds] t2 = 3+dt : dt : 6; % second time vector [seconds] t = [t1 t2]; % complete time vector [seconds] % define signal y = [sin(4.1*pi*t1).8*sin(8.3*pi*t2)]; % plot signal plot(t,y,'.-') xlabel('time [sec]'); ylabel('target Signal'); grid on ylim([-1.2 1.2]) Δημιουργούμε 2 συνεχόμενα ημιτονικά σήματα, τα οποία θέλουμε στην συνέχεια να αναπαραγάγουμε με το ΝΝ Adaline.
Δημιουργία δικτύου ADALINE % There are two basic types of input vectors: those that occur concurrently at the same time, or in no particular time sequence), and those that occur sequentially in time. For concurrent vectors, the order is not important, and if there were a number of networks running in parallel, you could present one input vector to each of the networks. For sequential vectors, the order in which the vectors appear is important. p = con2seq(y); % The resulting network will predict the next value of the target signal using delayed values of the target. inputdelays = 1:5; % delayed inputs to be used learning_rate = 0.2; % learning rate
Δημιουργία δικτύου ADALINE % Υπάρχουν δύο βασικοί τύποι ανυσμάτων εισόδου: Αυτά που προκύπτουν ταυτόχρονα (ή που δεν έχουν συγκεκριμένη χρονική ακολουθία) κι εκείνα που προκύπτουν διαδοχικά στον χρόνο (δηλαδή το ένα μετά το άλλο). Για τα ταυτόχρονα, η σειρά εμφάνισης δεν έχει σημασία και αν υπάρχει ένας αριθμός δικτύων που τρέχουν παράλληλα, μπορούμε να εφαρμόσουμε ένα άνυσμα εισόδου στο κάθε δίκτυο. Για τα διαδοχικά ανύσματα, η σειρά της εμφάνισής τους είναι σημαντική. p = con2seq(y); % Το δίκτυο που προκύπτει θα προβλέψει την επόμενη τιμή του επιθυμητού σήματος (στόχος) χρησιμοποιώντας τις καθυστερημένες χρονικά τιμές του στόχου. inputdelays = 1:5; % καθυστερημένες είσοδοι learning_rate = 0.2; % συντελεστής εκμάθησης
% define ADALINE Δημιουργία δικτύου ADALINE net = linearlayer(inputdelays,learning_rate); % Given an input sequence with N steps the network is updated as follows. Each step in the sequence of inputs is presented to the network one at a time. The network's weight and bias values are updated after each step, before the next step in the sequence is presented. Thus the network is updated N times. The output signal and the error signal are returned, along with new network. [net,y,e] = adapt(net,p,p); % view network structure view(net)
% ορισμός του ADALINE Δημιουργία δικτύου ADALINE net = linearlayer(inputdelays,learning_rate); % Με δεδομένη μια ακολουθία εισόδων με Ν βήματα, το δίκτυο επικαιροποιείται ως ακολούθως. Κάθε βήμα στην ακολουθία εισόδων εμφανίζεται στο δίκτυο ένα κάθε φορά. Τα βάρη και τα bias επικαιροποιούνται μετά από κάθε βήμα και πριν εμφανιστεί το επόμενο βήμα της ακολουθίας. Έτσι το δίκτυο επικαιροποιείται Ν φορές. Το σήμα της εξόδου και το σήμα του σφάλματος ξαναυπολογίζονται στο νέο δίκτυο. [net,y,e] = adapt(net,p,p); % Εμφάνιση της δομής του δικτύου view(net)
Δημιουργία δικτύου ADALINE % check final network parameters disp('weights and bias of the ADALINE after adaptation') net.iw{1} net.b{1} % transform result vectors Y = seq2con(y); Y = Y{1}; E = seq2con(e); E = E{1}; % start a new figure figure; % first graph subplot(211) plot(t,y,'b', t,y,'r--'); legend('original','prediction')
Δημιουργία δικτύου ADALINE grid on xlabel('time [sec]'); ylabel('target Signal'); ylim([-1.2 1.2]) % second graph subplot(212) plot(t,e,'g'); grid on legend('prediction error') xlabel('time [sec]'); ylabel('error'); ylim([-1.2 1.2])
Δημιουργία δικτύου ADALINE
Δημιουργία δικτύου ADALINE 1 0.8 0.6 0.4 Target Signal 0.2 0-0.2-0.4-0.6-0.8-1 0 1 2 3 4 5 6 Time [sec]
Δημιουργία δικτύου ADALINE Target Signal 1 0.5 0-0.5 Original Prediction -1 0 1 2 3 4 5 6 Time [sec] 1 0.5 Prediction error Error 0-0.5-1 0 1 2 3 4 5 6 Time [sec]