Documente Academic
Documente Profesional
Documente Cultură
1
I. INTRODUCERE
Calculul inteligent este un domeniu al Inteligentei Artificiale care grupeaza tehnici de rezolvare a
problemelor pentru care modelele formale conduc la algoritmi foarte costisitori.
Principalele directii ale calculului inteligent sunt:
Calcul neuronal : este folosit in principal pentru rezolvarea problemelor de asociere
(clasificare, aproximare, predictie etc), bazandu-se pe extragerea, prin invatare, a unui model pornind de
la exemple. Sursa de inspiratie o reprezinta structura si functionarea creierului uman.
Calcul evolutiv : este folosit in principal in rezolvarea problemelor bazate pe cautarea solutiei
intr-un spatiu mare de solutii potentiale (in particular in rezolvarea problemelor de optimizare).
Calcul fuzzy : este folosit atunci cand datele problemei (si relatiile dintre acestea) nu pot fi
descrise exact, ci exista un grad de incertitudine sau fuzziness. Ideea de baza este aceea de a inlocui
valorile exacte cu valori fuzzy descrise prin functii de apartenenta.
Reteaua neuronala este entitatea ce sta la baza calculului neuronal. In cele ce urmeaza se prezinta
cateva caracteristici generale despre retelele neuronale artificiale – RNA.
Din punct de vedere functional o retea neuronala este un sistem ce primeste date de intrare
(corespunzatoare datelor initiale ale unei probleme) si produce date de iesire (ce pot fi interpretate ca
raspunsuri ale problemei analizate). O caracteristica esentiala a retelelor neuronale este capacitatea de a se
adapta la mediul informational corespunzator unei probleme concrete printr-un proces de invatare. In
felul acesta reteaua extrage modelul problemei pornind de la exemple.
Din punct de vedere structural o retea neuronala este un ansamblu de unitati interconectate
(neuroni) fiecare fiind caracterizata de o functionare simpla. Functionarea unitatilor este influentata de o
serie de parametri adaptabili. Astfel o retea neuronala este un sistem extrem de flexibil.
2
- AXON : canal de iesire .
Pentru a oferi o viziune completa a acestei valori de iesire, mentionam mai jos cele mai uzuale
functii de activare/transfer :
c. sigmoidala :
i. logistica :
Arhitectura retelei neuronale artificiale se refera la modul in care sunt amaplasate unitatile
functionale (topologie) si la modul in care sunt interconectate.
Dpdv al arhitecturii o retea neuronala poate fi formalizata printr-un graf orientat, etichetat, in
nodurile caruia sunt plasate neuronii artificiali si ale carui arce specifica conexiunile si implicit fluxul
informational. In ceea ce priveste rolul unitatilor functionale, acestea se impart in trei mari categorii :
3
unitati de intrare : primesc semnale din partea mediului si retransmit semnalul primit
catre urmatoarele unitati din retea, fara a realiza o prelucrare prealabila asupra
acestuia;
unitati ascunse : conectate doar cu alte unitati ale retelei, fara a comunica direct cu
mediul extern; rolul acestora este de a colecta semnale, de a le prelucra si de a distribui
semnalul prelucrat catre alte unitati ascunse sau de iesire;
Modul de interconectare al neuronilor artificiali determina fluxul de semnale prin retea, fiind
totodata un factor esential in stabilirea algoritmului de functionare. Din perspectiva prezentei conexiunilor
inverse grafului asociat, retele se clasifica in :
2. Retele recurente. Graful asociat contine conexiuni inverse directe sau indirecte.
Invatarea reprezinta procesul prin care un sistem isi imbunatateste performantele prin achizitie de
cunostinte. In cazul RNA, invatarea se refera la orice modificare a parametrilor acesteia (a ponderilor
fiecarui neuron in parte) ce asigura o mai buna adecvare a comportarii retelei la problema pt. care a fost
proiectata.
Procesul de invatare se bazeaza pe doua elemente :
o multime de informatii denumita si set de antrenare sau sabloane;
4
1. Nesupervizata (auto-organizare) : sistemul primeste doar semnale de intrare din
partea mediului si pe baza acestora descopera trasaturile statistice ale populatiei
stimulilor, construindu-si o reprezentare codificata in ponderi a mediului. Regula de
ajustare a ponderilor pt acest tip de invatare sugereaza ca in procesul de adaptare a
ponderilor dintre unitatea j si unitatea i, intervin doar semnalele de iesire respectiv de
intrare al celor doua unitati.
In proiectul prezent s-a optat pentru implementarea unei RNA care sa fie capabila de
recunoasterea anumitor forme din popularul joc Tetris.
Parametrii generali ai retelei sunt prezentati mai jos :
TIP
STRUCTURA
5
foloseşte eroarea între ieşirile actuale (rezultate prin calcul, propagând înainte valorile de pe
intrări, specificate de şabloane) şi ieşirile aşteptate (cele impuse de şablonul curent), pentru a
ajusta fiecare pondere. Ajustarea ponderilor se face secvenţial, plecând de la ultimul strat (cel de
ieşire), spre primul strat (cel de intrare).
0,1,0,0,0,0,1,1,0,0,0,1,1,0,0,0,0,1,0,0,0,0,0,0,0 0,0,1
0,0,0,0,0,0,0,1,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0 0,1,0
0,0,0,0,0,1,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0 0,1,1
6
Reteaua prezinta 25 de neuroni de intrare, 2 neuroni de iesire si 20 de neuroni in stratul
ascuns.
Ponderile sunt salvate intr-un fisier text, ponderi.txt, sabloanele de intrare si de iesire se
preiau din fisier text,sabloane2.txt; la fel si intrarile.
Programul prezinta o interfata simpla pentru utilizator, intrebandu-ul in fiecare moment
ce doreste sa faca, astfel:
- daca doreste antrenarea retelei, acesta putand raspunde prin “da” sau “nu”;
-
7
package rna;
import java.util.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.io.*;
import java.lang.String.*;
class DefectareRN
{
static final int N=5;//dimensiunea matricii de pixeli, pe intrare
static final int NNI=N*N;
static final int NNO=2;
static final int NNH=20;
static final int NTS=3*NNO;//nr total de sabloane 3 pt fiecare clasa de iesire
static final double Epsilon=0.01;//eroare impusa
static final int NME=20000;//nr max de epoci
static double w1[][]=new double[NNH][NNI];
static double w2[][]=new double[NNO][NNH];
static double sabloaneIn[][]=new double[NTS][NNI];
static double sabloaneOut[][]=new double[NTS][NNO];
static double yH[]=new double[NNH];
static double yO[]=new double[NNO];
static double intrari[]=new double[NNI];
8
System.exit(0);
}//for infinit
}//main
9
System.out.println("Structura fisierului de sabloane nu este corecta!");
System.exit(1);
}
//Citim valorile din sablon, pt. fiecare neuron de iesire:
st=new StringTokenizer(linieCrt);
for(int i=0;i<NNO;i++)
sabloaneOut[ex][i]=Double.valueOf(st.nextToken()).doubleValue();
//Double.valueOf(string) scoate un obiect Double.
//Extragem tipul primitiv double din Double,
// cu: Double.doubleValue();
}//for i
bfr.close();
}
catch(IOException e)
{
System.out.println(e);
System.exit(1);
}}//incarca sabloane
private static boolean antrenare()
{
//declare variabile locale
double eroareIesireSablonCrt[]=new double[NTS];
double eroareTotala;
int nrEpoci=0;
boolean converge=false;
boolean stop=false;
int i,ex;
while(!stop)
{
for(ex=0;ex<NTS;ex++)
{
calculIesiriNeuroni(yH,yO,ex);
eroareIesireSablonCrt[ex]=0;
for(i=0;i<NNO;i++)
eroareIesireSablonCrt[ex]+=0.5*(yO[i]-sabloaneOut[ex]
[i])*(yO[i]-sabloaneOut[ex][i]);
modificaPonderi(yO,yH,ex);
}//for ex
nrEpoci++;
eroareTotala=0;
for(ex=0;ex<NTS;ex++)
eroareTotala+=eroareIesireSablonCrt[ex];
System.out.println("La epoca nr.: "+nrEpoci+" eroarea totala este de
"+eroareTotala);
if(eroareTotala<=Epsilon)
{
converge=true;
stop=true;
salvarePonderi();
}
if(nrEpoci>NME)stop=true;
}//while
return converge;
}//antrenare
10
{
int i,j;
double xTotalI;
for(i=0;i<NNH;i++)
{
xTotalI=0;
for(j=0;j<NNI;j++)
xTotalI=xTotalI+sabloaneIn[ex][j]*w1[i][j];
yH[i]=1/(1+Math.exp(-xTotalI));
}//for i
for(i=0;i<NNO;i++)
{
xTotalI=0;
for(j=0;j<NNH;j++)
xTotalI=xTotalI+yH[j]*w2[i][j];
yO[i]=1/(1+Math.exp(-xTotalI));
}//for i
}//calcul iesiri neuroni
11
bfw=new BufferedWriter(fw);
for(i=0;i<NNH;i++)
{
s="";
for(j=0;j<NNI;j++)
s=s+w1[i][j]+" ";
bfw.write(s);
bfw.newLine();
}
for(i=0;i<NNO;i++)
{
s="";
for(j=0;j<NNH;j++)
s=s+w2[i][j]+" ";
bfw.write(s);
bfw.newLine();
}
bfw.close();
fw.close();
}//try
catch(IOException e)
{
System.out.println("Eroare!!!"+e);
System.exit(1);
}
}//salveaza ponderi
12
}
if(indiceMax==0) System.out.println("Este forma TETRIS! Cu precizia de "+max*100+"
%");
}//testare
13
{
fr=new FileReader("intrare.txt");
bfr=new BufferedReader(fr);
String linieCrt;
for(i=0;i<N;i++)
{
linieCrt=bfr.readLine();
if(linieCrt==null)
{
System.out.println(" Fisier de intrare incorect!");
System.exit(1);
}
StringTokenizer st=new StringTokenizer(linieCrt," ");
for(j=0;j<N;j++)
intrari[i*N+j]=Integer.parseInt(st.nextToken());
}//for i
bfr.close();
fr.close();
}//try
catch(IOException e)
{
System.out.print("ATENTIE!"+e);
System.exit(1);
}
}//citire intrari
14
pondere=r.nextInt(NNH*NNO);
System.out.println("w2 "+pondere);
if(v2[pondere]==1)
{
v2[pondere]=0;
w2[pondere/NNH][pondere%NNH]=0;
index++;
}
}//while w2
}//defectare ponderi
}//class DefectareRN
15