Učenje reprezentacije podataka

Neuronske mreže nam mogu pomoći da izdvojimo neke apstraktne atribute u podacima i naučimo reprezentacije koje su podesne za rešavanje zadataka.

U primerima koje smo do sada koristili najčešće smo se oslanjali na postojanje nekog skupa atributa u skupu podataka. Uistinu govoreći, veliki broj domena generiše baš podatke koji su ovog oblika, sa atributima u kolonama i instancama u pojedinačnim redovima. Kao što smo videli u uvodnom delu u priči o pripremi podataka, čak i kada raspolažemo ovakvim atributima nije baš najintuitivnije odlučiti koje atribute treba da odaberemo za kreiranje modela. To nas je stavljalo u poziciju da oprobavamo različite kombinacije ili osmišljavamo tehnike koje nam mogu pomoći u selekciji atributa. Usled kompleksnosti funkcija koje modeluju, neuronske mreže se mogu pohvaliti svojstvom da mogu lepo da nauče da filtriraju i grupišu atribute koji su bitni.

 Ovo svojstvo neuronskih mreža je posebno važno u radu sa podacima koji nisu tabelarni - pokrenuli smo već mnogo puta pitanje kako predstaviti, na primer, slike, tekstualne podatke ili audio-zapise. Iako imamo znanja o ovim formatima, teško nam je da opišemo šta tačno oni sadrže na neki koncizan i upotrebljiv način. To nas je, između ostalog, i motivisalo za primenu paradigme programiranja vođenog podacima. Neuronske mreže mogu (u to ćemo se uskoro uveriti) na osnovu podataka u izvornom obliku da nauče neke apstraktne atribute koji su korisni za uspešno rešavanje zadataka.

 U nastavku ćemo upoznati konvolutivne neuronske mreže koje se koriste primarno u radu sa slikama i videom i za učenje vizuelnih atributa ulaza, a zatim i rekurentne neuronske mreže i transformere, tipove neuronskih mreža koje se koriste za učenje atributa sekvencijalnih podataka kao što su tekst ili zvuk.

Konvolutivne neuronske mreže

Konvolutivne neuronske mreže su vrsta neuronskih mreža koje se primarno koriste u oblasti računarskog vida za rad sa slikama i video-sadržajima.

Crno -bele slike predstavljamo matricama piksela. Broj vrsta ove matrice odgovara visini slike, dok broj kolona ove matrice odgovara njenoj širini. Pojedinačne vrednosti piksela su brojevi u rasponu od 0 do 255, gde 0 predstavlja crnu a 255 belu boju. Sve vrednosti između predstavljaju neku nijansu sive. Da li možeš da naslutiš šta se krije iza slike koja je predstavljena donjom matricom piksela? Ako se odmakneš dovoljno daleko pa nacrtaš konture duž tamnijih nijansi, možda ćeš uspeti da pogodiš šta je na slici. Pomoć je da su u zajednici koja se bavi mašinskim učenjem slike mačaka prilično čest izbor.

cat

 Baš kao što je i nama, ljudima, teško da razumemo šta se to nalazi na slici prikazanoj skupinom brojeva, tako i je i sa konvolutivnim neuronskim mrežama. One analizu slike započinju tako što prvo prepoznaju neke proste elemente kao što su horizontalne i vertikalne linije, a zatim ih dalje kombinuju i dodaju kompleksnost sve dok ne stignu do nekih složenih opisa slike koji im mogu pomoći da reše traženi zadatak. Sada je prirodno pitanje kako krenuti od prostih kontura i nadograđivati ih tako da se dobiju kompleksnije strukture. Odgovor će nam dati operator konvolucije.

Operator konvolucije je najlakše uvesti kroz ilustracije. Zamislimo da imamo na ulazu matricu dimenzija 6x6 piksela koja predstavlja sliku, i jednu malu matricu, takozvani filter, dimenzija 3x3 piksela. Neka su to baš matrice koje su prikazane na donjoj slici. Nad slikom započinjemo primenu operatora konvolucije (obeležićemo ga sa ) tako što preklopimo deo slike u gornjem levom uglu sa filterom zatim pomnožimo pojedinačne vrednosti i zbir tako dobijenih vrednosti upišemo u jednu novu matricu Ta matrica će za pravo predstavljati rezultat primene operatora konvolucije.

Konvolucija - korak 1

Nastavićemo dalje da primenjujemo operator konvolucije: preklopićemo filter sa delom slike koji se nalazi u gornjem levom uglu, ali tako da je on sada pomeren za jedan piksel u odnosu na levu ivicu, tj. u odnosu na prethodni položaj. Opet ćemo pomnožiti pojedinačne vrednosti, sabrati ih i upisati u rezultujuću matricu.

Konvolucija - korak 2

Filter ovako možemo da pomeramo za po jednu poziciju desno sve do ivice. Tada je potrebno da ga spustimo za jednu poziciju naniže i vratimo tik uz ivicu. Zatim možemo da nastavimo postupak dok ne stignemo do donjeg desnog ugla. Kao rezultat ove operacije dobićemo matricu dimenzija 4x4 piksela, čije su vrednosti prikazane na donjoj slici (obavezno se uveri!).

Convolution - the result

 Koliko će filter biti pomeren u svakoj iteraciji definiše se hiperparametrom koji zovemo pomeraj (eng. stride). U našem slučaju pomeraj je imao vrednost 1 jer smo filter pomerali za jednu poziciju udesno, odnosno kada je trebalo za jednu poziciju naniže. Da bi mogli da utičemo i na dimenzije rezultujuće matrice prilikom primene operacije konvolucije (obično želimo da očuvamo dimenzije koje odgovaraju ulaznoj matrici), možemo da dodamo okvir oko polazne slike. To je najčešće neki blok nula ili jedinica ili brojeva čije vrednosti odgovaraju vrednostima najbližeg piksela na slici. Okvir zvanično nazivamo proširenje (eng.  padding   ) i njegovu širinu uvek naglašavamo prilikom primene operacije konvolucije. On nam je posebno značajan ukoliko su karakteristike koje želimo da naš model nauči blizu ivice slike. 

Donja animacija ilustruje ceo proces primene filtera nad slikom, tj. nad njenom matricom. Kao što možeš primetiti, korišćen je pomeraj veličine 1 i proširenje veličine 0.

Animacija operacije konvolucije

Ako filter iz prethodnog primera primenimo koristeći operaciju konvolucije nad početnom slikom mace, dobićemo donju sliku. Možemo da primetimo da su na njoj naglašene sve vertikalne linije koje se pojavljuju na slici.


Izdvajanje vertikalnih ivica

Posmatraj sliku sleva nadesno. Kada prvi put pređeš iz svetlog dela slike u tamni deo slike zapravo vidiš vertikalnu ivicu. Primenimo sada sleva nadesno filter operacijom konvolucije. Najveći rezultat jedne iteracije konvolucije biće kada je desna strana našeg filtera (kolona sa brojevima -1) pozicionirana baš na vertikalnoj ivici. Pošto je ivica tamna, vrednosti koje toj boji odgovaraju su male jer je crna boja predstavljena nulom. Vrednosti levo od ivice su svetle pa su brojevi koji odgovaraju tim bojama veći (vrednost za belu boju je 255). Kada male vrednosti, koje odgovaraju crnoj boji ivica, pomnožimo sa -1 tj. desnim delom filtera, a velike vrednosti, koje odgovaraju svetlim bojama levo od ivice, pomnožimo sa 0 i 1 tj. preostalim kolonama filtera, rezultat je veća vrednost nego kada bi se filter našao bilo gde drugo gde nema vertikalnih ivica (brojevi koji množe vrednosti -1 bi bili veći pa bi ukupni zbir bio manji). Taj kontrast u vrednostima se oslikava i na rezultujućoj slici - vertikalne linije su tu bele (velike vrednosti piksela) dok je sve ostalo crno (male vrednosti piksela). Na ovaj način dajemo sposobnost konvoluciji da izračuna ono što ljudi mogu da zaključe gledanjem. Na neki način, ovako joj dajemo vid.

Dovoljno je da zarotiraš filter koji izdvaja vertikalne ivice! Da li ti to ima smisla?

Sada kada znamo kako da izdvojimo vertikalne i horizontalne ivice, kombinovanjem na razne načine možemo da izdvajamo i linije koje nisu samo horizontalne i vertikalne. Daljim kombinovanjem tih rezultata možemo da izdvajamo čak i sferne konture. Na ovo smo mislili kada smo rekli da krećemo od jasnih karakteristika lakih za učenje a zatim korak po korak gradimo na kompleksnosti karakteristika koje možemo da naučimo.

 Slojevi neuronske mreže koje karakteriše primena operatora konvolucije nazivaju se   konvolutivni slojevi  Dok su pioniri u oblasti računarskog vida kreirali filtere ručno, cilj obučavanja konvolutivnih neuronskih mreža je da same nauče vrednosti koje u njima figurišu.

 

Na donjoj slici možeš da vidiš prikaze naučenih filtera po slojevima jedne konvolutivne neuronske mreže koja prepoznaje lica. Na najnižem sloju to su neke horizontalne, vertikalne i dijagonalne linije, na drugom sloju to su već obrisi koji odgovaraju delovima lica poput nosa, očiju i usta, dok su na trećem sloju to filteri koji odgovaraju konturama lica.

Uzastopne primene operatora konvolucije

 Uz operaciju konvolucije, konvolutivne mreže karakteriše i operacija   agregacije   (eng. pooling). Kao što samo ime kaže, cilj ove operacije je da agregira tj. objedini ulaze. Na donjoj slici možeš da vidiš dve vrste operatora agregacije: onaj koji koristi maksimum i onaj koji koristi prosek da bi agregirao informacije. Baš kao i operator konvolucije, i ovaj operator se primenjuje nad blokovima ulaza tako što se uoči blok i nad njim izvrši potrebno izračunavanje. Ovako dobijena vrednost se upisuje u novu matricu. Na slici su oba operatora primenjena nad blokovima dimenzije 2x2. Intuitivno govoreći, maksimumima naglašavamo najdominantniji deo, dok računanjem proseka uzimamo u obzir doprinos svih delova.

Primenom operacije agregacije dobijamo mogućnost da smanjimo dimenziju ulaza, ali uz istovremeno zadržavanje dela informacija koje su sadržane. Na slici možeš da vidiš da smo primenom operatora agregacije sveli matricu sa dimenzije 4x4 na dimenziju 2x2. Zašto nam je smanjenje dimenzije potrebno? Pa mreža kao rezultat treba da nam da neki konkretan odgovor, recimo da li je na slici mačka ili ne, za koji nam je potreban mali broj neurona.

 Slojevi neuronske mreže koje karakteriše primena operatora agregacije se zovu   slojevi agregacije   (eng.  pooling layers  ). U njima nema dodatnih parametara koje mreža treba da nauči, ali nam, kao što smo videli, pomažu da kontrolišemo dimenzije matrica sa kojima radimo.

 Sada kada znamo koji su to gradivni slojevi jedne konvolutivne neuronske mreže, hajde da vidimo kako možemo da ih povežemo i dobijemo funkcionalan model koji može da nam pomogne u rešavanju zadatka klasifikacije. Zamislićemo da treba da rešimo zadatak višeklasne klasifikacije u kojem za svaku sliku crtanog lika treba da odredimo da li je Tviti, Šilja ili Patak Dača. Posmatrajmo ilustraciju arhitekture duboke konvolutivne neuronske mreže koju smo odabrali za rešavanje ovog zadatka i prodiskutujmo kakva je motivacija za njeno kreiranje.

 Na početku mreže se nalazi ulazni sloj koji sadrži piksele slike. Zatim sledi konvolutivni sloj (blok plave boje). Cilj ovog sloja je da primenom operatora konvolucije izdvoji neki prvi skup apstraktnih atributa. Nakon toga postavljamo sloj agregacije (zeleni blok), a zatim još po jedan konvolutivni sloj (narandžasti blok) i sloj agregacije (crveni blok). Slojevi konvolucije i agregacije se u praksi kombinuju i često nalaze jedan do drugog jer se slojevima agregacije dodatno agregira,  tj. sumira ono što su konvolutivni slojevi naučili. Drugi konvolutivni sloj nam omogućava primenu drugog operatora konvolucije nad atributima koje je već izdvojio prvi konvolutivni sloj i formiranje kompleksnijih atributa slike. Nakon ovog bloka slojeva sledi sloj (sivi blok) koji ima zadatak da ”ispravi” matricu (ili, prezicnije, tenzor) koju smo dobili do tog trenutka i prepakuje njene vrednosti tako da sve budu jedna do druge u jednom nizu. Slojevi sa ovom svrhom se nazivaju slojevi ispravljanja (eng.  flattening layers  ). Nakon ispravljanja možemo dalje da nadovežemo neku potpuno povezanu neuronsku mrežu. Ova mreža će sada kao ulaze imati apstraktne atribute koje za nju uči kombinacija konvolutivnih slojeva i slojeva agregacije. Osim ispravljenog ulaznog sloja, na slici vidimo i jedan skriveni sloj kao i izlazni sloj u kojem se nalaze tačno tri neurona - za svakog od crtanih likova po jedan. Izlazne vrednosti ovih neurona odgovaraju verovatnoći da slika sa ulaza pripada baš klasi koju oni predstavljaju. Za sliku Tvitija koju imamo na ulazu možemo da primetimo da je izlazna vrednost trećeg neurona, koji baš odgovara toj klasi, najveća i da iznosi 0,7.

 Sada možemo da vidimo i kako izgleda arhitektura mreže   VGGNet popularne konvolutivne mreže koja se aktivno koristi u praksi.

 VGGNet   predstavlja duboku konvolutivnu neuronsku mrežu koju je razvio oksfordski tim   Visual Geometry Group   (otuda i naziv   VGGNet  ). Na prestižnom takmičenju   Large Scale Visual Recognition Challenge  održanom 2014. godine, ova mreža se pokazala kao najbolja u rešavanju problema lokalizacije objekata na slici i kao druga po redu u problemu klasifikacije objekata sa slike. Za zadatak klasifikacije korišćeno je preko 1,2 miliona slika skupa   ImageNet   koji smo upoznali i klasifikacija u mogućih 1000 klasa. Da bi se ova mreža istrenirala, bilo je potrebno između 15 i 20 dana koristeći 4 grafičke kartice (najbolje u tom trenutku)   NVIDIA Titan Black  Pre nje je najbolja u ovim zadacima bila mreža   AlexNet  koja je značajna po tome što je uvela praksu korišćenja grafičkih kartica za obučavanje neuronskih mreža i omogućila dalji razvoj dubokog učenja.

 Arhitektura mreže   VGG-16 verzije mreže sa 16 slojeva, prikaza je na donjoj slici. Kao što možemo da vidimo, na ulazu se očekuje slika u boji dimenzije 244x244 piksela, a mreža kombinuje konvolutivne slojeve i slojeve agregacije (sa maksimumom) i završava potpuno povezanom neuronskom mrežom sa 1000 neurona na izlazu, gde svaki neuron odgovara jednoj konkretnoj klasi skupa   ImageNet  Sama mreža ima 138 miliona parametara i za njihovo čuvanje je potrebno oko 500МB memorije.


VGG-16 Network Display

Povećavanje broja slojeva konvolutivnog dela mreže u praksi najčešće daje bolje rezultate. Ipak broj slojeva se ne može beskonačno povećavati. Ne samo zbog ograničenja resursa, vremena i cene već i zbog matematičkih svojstava dubokih neuronskih mreža koja dalje otežavaju primenu algoritma propagacije unazad i samo treniranje mreže.

Ako te zanima ovaj matematički problem, možeš da probaš da pročitaš više o nestajućim i eksplodirajućim gradijentima, a posebno u delu konvolutivnih mreža i o rezidualnim konekcijama.

Pre nego li se i praktično oprobamo u zadatku rada sa konvolutivnim neuronskim mrežama, osvrnimo se na pitanje rada sa slikama u boji. Njih do sada nismo pominjali.

 Kada treba da predstavimo sliku u boji, onu koja koristi RGB format boja i sve boje prikazuje kao kombinacije crvene, zelene i plave boje, koristimo tri matrice. Za svaku od boja predviđena je po jedna matrica. Broj matrica koje koristimo za prikaz slika nazivamo   kanalima Tako crno-bele slike imaju samo jedan kanal, dok slike u boji imaju tri kanala.


Prikaz slika koje koriste RGB format boja

Prisustvo boja utiče na izvođenje operacije konvolucije tako što broj kanala filtera treba prilagoditi broju kanala slike na koju ga primenjujemo. Dalje treba upariti svaki od kanala filtera sa kanalom slike (crveni sa crvenim, plavi sa plavim i zeleni sa zelenim) i izvršiti operaciju konvolucije kao da se radi sa jednim kanalom. Zatim treba sabrati matrice koje dobijamo na ovaj način i rezultujuću matricu proglasiti finalnim rezultatom. Na donjoj slici možemo da vidimo dva filtera u konvolutivnom sloju koja se primenjuju nad ulaznom slikom u boji. Kao rezultat primene svakog od ovih filtera ćemo dobiti zasebne matrice koje, kada ih ”spojimo”, predstavljaju finalni rezultat konvolutivnog sloja. U praksi se na nivou jednog konvolutivnog sloja obično postavlja više filtera pa se kao rezultati dobijaju tenzori. Nad ovim tenzorima se dalje na isti način primenjuju operacije konvolucije - vodi se samo računa o tome da broj kanala filtera odgovara dimenziji tenzora (recimo, za narednu primenu u primeru koji smo razmatrali to bi bio broj 2) i da se upari odgovarajući kanal ulaza sa odgovarajućim kanalom filtera.


Primena operatora konvolucije na ulaze sa više kanala

Što se tiče operacije agregacije, ona se primenjuje nad svakim kanalom ulazne slike. Na primer, ako ulazna slika ima 3 kanala, operacija agregacije će biti primenjena nad svakim kanalom zasebno. Ovo znači i da operacija agregacije čuva broj kanala prilikom primene. Na donjoj slici može se videti ilustracija ovog procesa.

Applying pooling Operators to Multi-Channel Inputs

 Ova sekcija je uparena sa Jupyter sveskom  09-VGG-16_network_and_classification.ipynb Da bi mogao da pratiš sadržaj dalje, klikni na link, a potom i na dugme   da bi se sadržaj otvorio u okruženju   Google Colab Ukoliko sveske pregledaš na lokalnoj mašini, među sadržajima pronađi svesku sa istim imenom i pokreni je. Za detaljnije instrukcije pogledaj sekciju   Hands-on zona   i lekciju   Jupyter sveske za vežbu

 Oprobajmo sada kako konvolutivna mreža   VGG-16   zaista radi! Ne zaboravi da uporedo sa čitanjem lekcije pratiš svesku sa kodom.

 Jednom istreniran model neuronske mreže može da se podeli sa zajednicom tako što se podele parametri koji figurišu u njemu. U ovom primeru koristićemo model koji je dostupan u biblioteci   Keras Biblioteka   Keras   je biblioteka otvorenog koda sa širokom upotrebom u zajednici koja se bavi mašinskim učenjem. Da bismo mogli da iskoristimo model mreže   VGG-16   potrebno je da izvršimo sledeće dve naredbe:

from tensorflow.keras.applications import VGG16
model = VGG16(weights = 'imagenet')

Informacije o modelu koji smo učitali možemo da pročitamo koristeći funkciju model.summary(). Njen rezultat je opis slojeva mreže praćen informacijom o veličinama ulaza koji ti slojevi očekuju. Sada možeš da izvršiš naredbu:

model.summary()

 Nemoj da te zbuni ako ne razumeš sve detalje koji se prikazuju nakon izvršavanja ove naredbe. Važno je da znaš da se na ulazu očekuje slika dimenzije 224x224 piksela u boji (zato je i pored ulaznog sloja navedeno 224, 224, 3) i da na izlazu imaš jednu od 1000 klasa. Ispis možeš da uporediš i sa slikom modela   VGG-16   koju smo razmatrali i tako otkriješ više informacija.

 Važno je da naglasimo da mrežu   VGG-16   nećemo trenirati - koristićemo samo istrenirani model. Zato parametre modela u toku rada ne smemo da menjamo - svaki ima svoj doprinos. Ukupan broj parametara modela koji možemo da pročitamo u sažetku mreže je nešto preko 138 miliona.

 Ideja je da slika nad kojom ćemo testirati model bude neka proizvoljna slika sa veba. Da bismo to uspeli da uradimo, koristićemo nekoliko standardnih Python biblioteka. Za zadati URL funkcija ucitaj_sliku će nam pomoći da prevučemo sliku koju želimo.

def ucitaj_sliku (url_putanja):
  response = request.urlopen(url_putanja).read()
  return Image.open(BytesIO(reply))

 Za testiranje smo odabrali sliku zlatnog retrivera sa adrese   https://unsplash.com/photos/x5oPmHmY3kQ koja može slobodno da se koristi. Ti možeš odabrati sliku koju želiš! Važno je da imaš na umu da klasa objekta na slici mora biti poznata modelu. Pošto je model   VGG-16   treniran na preko 1,2 miliona slika, on poznaje veoma mnogo klasa, čak 1000 različitih. Zlatni retriver je jedna od njih. Ukoliko modelu damo sliku sa nekim objektom koji ne poznaje,  on će nam dati predikcije klasa čije slike najviše podsećaju na našu. Videćemo na kraju koje sve klase nalikuju na zlatnog retrivera.

Junak priče o modelu VGG-16

Pošto slika koju treba da prosledimo modelu treba da bude specijalno pripremljena, uradićemo sledeće:

postaviti joj dimenzije na 224x224 i reći da koristi tri kanala boja RGB:

test_slika = test_slika.resize((224, 224))
test_slika = test_slika.convert('RGB')

transformisati sliku u odgovarajući matrični format:

matrix _oblik _test_slike = image.img_to_array(test_slika)

napraviti paketić koji sadrži našu sliku:

packet = np.expand_dims(matricni_oblik_test_slike, axis = 0)

izvršiti numeričko pretprocesiranje slike u vidu normalizacije:

test _skup _slika = preprocess_input(packet)

Tek ovako pripremljenu sliku možemo da prosledimo modelu za klasifikaciju. Funkcija koja će nam pomoći se (očekivano) zove predict.

predictions _modela = model.predict(test_skup_slika)

Promenljiva predikcije_modela u kojoj smo sačuvali predikcije modela je niz dužine 1000 i sadrži verovatnoće pripadnosti naše slike svakoj od 1000 klasa koje model raspoznaje. Da bismo izdvojili klasu kojoj pripada naša slika, možemo iskoristiti funkciju decode_predictions, koja će nam vratiti verovatnoće i imena za 5 najverovatnijih klasa. Ovo će nam dati uvid u to koliko je model siguran prilikom klasifikacije. Nakon što izvršimo sledeću naredbu dobićemo informacije o najverovatnijim klasama.

najverovatnije_klase = decode_predictions(predikcije_modela)[0]

Kada ove predikcije grafički prikažemo kodom koji je naveden niže, dobićemo grafikon sa stubićima koji nam omogućava da lakše analiziramo rezultate.

ime_klase = [tuesday[1] for tuesday and najverovatnije_klase]
probability _pripadnosti = [tuesday[2] for tuesday and najverovatnije_klase]
plt .figure(figsize=(10, 4))
plt .bar (name _klase , verovatnoca_pripadnosti, color =['teal', 'yellow', 'green', 'blue', 'orange'])
plt .title ('The Five Most Likely Classes')
plt .ylabel ('Probability of Affiliation')
plt.show()

Kao što možemo videti, model je sa velikom sigurnošću (verovatnoća je 0,804) predvideo da je slika koju smo odabrali slika zlatnog retrivera. Neke od drugih klasa koje je model uzeo u obzir su neke druge vrste retrivera. Neobično je da se u listi rezultata pojavila i teniska loptica. Verovatno zato što u skupu za obučavanje postoje i slike u kojima retriveri trče za teniskim lopticama. Ovakvo ponašanje modela bi u praksi trebalo dodatno da ispitamo.

 

 

Vizuelno_Ucenje_Konvolucione_Mreze_Titani.pdf

Evolucija_Konvolucionih_Mreza.pdf

Last modified: Sunday, 14 December 2025, 11:58 PM