Kako implementirati CNN s Deeplearning4j

1. Pregled

U ovom uputstvu ćemo izgraditi i uvježbati konvolucijsku neuronsku mrežu model koristeći knjižnicu Deeplearning4j na Javi.

Dodatne informacije o postavljanju knjižnice potražite u našem vodiču o Deeplearning4j.

2. Klasifikacija slika

2.1. Izjava o problemu

Pretpostavimo da imamo skup slika. Svaka slika predstavlja objekt određene klase. Štoviše, objekt na slici pripada jedinoj poznatoj klasi. Tako, iskaz problema je izgraditi model koji će moći prepoznati klasu predmeta na datoj slici.

Na primjer, recimo da imamo skup slika s deset gesta rukama. Izrađujemo model i treniramo ga da ih klasificira. Nakon treninga, možemo proslijediti druge slike i klasificirati geste rukama na njima. Naravno, dana gesta trebala bi pripadati poznatim klasama.

2.2. Predstavljanje slika

U računalnoj memoriji slika se može prikazati kao matrica brojeva. Svaki broj je vrijednost piksela, u rasponu od 0 do 255.

Slika u sivim tonovima je 2D matrica. Slično tome, RGB slika je 3D matrica s dimenzijama širine, visine i dubine.

Kao što možemo vidjeti, slika je skup brojeva. Stoga možemo izgraditi višeslojne mrežne modele kako bismo ih osposobili za klasificiranje slika.

3. Konvolucijske neuronske mreže

Konvolucijska neuronska mreža (CNN) višeslojni je mrežni model koji ima specifičnu strukturu. Struktura CNN-a može se podijeliti u dva bloka: konvolucijski slojevi i potpuno povezani (ili gusti) slojevi. Pogledajmo svakog od njih.

3.1. Konvolucijski sloj

Svaki konvolucijski sloj je skup kvadratnih matrica, koje se nazivaju jezgre. Iznad svega, trebaju nam da izvrše konvoluciju na ulaznoj slici. Njihova količina i veličina mogu se razlikovati, ovisno o danom skupu podataka. Uglavnom koristimo jezgre 3 × 3 ili 5 × 5, a rijetko one 7 × 7. Točna veličina i iznos odabiru se metodom pokušaja i pogrešaka.

Uz to, slučajno odabiremo varijable matrica zrna na početku vlaka. Oni su težine mreže.

Da bismo izvršili konvoluciju, jezgru možemo koristiti kao klizni prozor. Pomnožit ćemo težine jezgre s odgovarajućim slikovnim pikselima i izračunati zbroj. Tada možemo premjestiti jezgru da pokrije sljedeći dio slike pomoću koraka (pomicanje udesno) i dodavanja (pomicanje prema dolje). Kao rezultat, imat ćemo vrijednosti koje će se koristiti u daljnjim proračunima.

Ukratko, s ovim slojem dobivamo uvijenu sliku. Neke varijable mogu biti manje od nule. To obično znači da su ove varijable manje važne od ostalih. Zbog toga je primjena funkcije ReLU dobar pristup za daljnje manje izračuna.

3.2. Sloj poduzorkovanja

Sloj poduzorka (ili udruživanja) sloj je mreže, koji se obično koristi nakon konvolucijskog. Nakon konvolucije dobivamo puno izračunatih varijabli. Međutim, naš je zadatak odabrati najvrjednije među njima.

Pristup je primjena algoritma kliznog prozora na savijenu sliku. U svakom ćemo koraku odabrati maksimalnu vrijednost u kvadratnom prozoru unaprijed definirane veličine, obično između 2 × 2 i 5 × 5 piksela. Kao rezultat, imat ćemo manje izračunatih parametara. Stoga će to smanjiti proračune.

3.3. Gusti sloj

Gusti (ili potpuno povezani) sloj je onaj koji se sastoji od višestrukih neurona. Ovaj nam je sloj potreban za klasifikaciju. Štoviše, mogu postojati dva ili više takvih posljedičnih slojeva. Važno je da posljednji sloj treba imati veličinu jednaku broju klasa za klasifikaciju.

Rezultat mreže je vjerojatnost da slika pripada svakoj od klasa. Da bismo predvidjeli vjerojatnosti, upotrijebit ćemo funkciju aktiviranja Softmax.

3.4. Tehnike optimizacije

Za izvođenje treninga moramo optimizirati težine. Zapamtite, mi u početku slučajno biramo ove varijable. Neuronska mreža je velika funkcija. I, ima puno nepoznatih parametara, naše težine.

Kad sliku proslijedimo mreži, ona nam daje odgovor. Onda, možemo izgraditi funkciju gubitka, koja će ovisiti o ovom odgovoru. Što se tiče učenja pod nadzorom, također imamo stvarni odgovor - pravi razred. Naše misija je minimizirati ovu funkciju gubitka. Ako uspijemo, onda je naš model dobro obučen.

Da bismo funkciju sveli na minimum, moramo ažurirati težine mreže. Da bismo to učinili, možemo izračunati izvod funkcije gubitka s obzirom na svaki od ovih nepoznatih parametara. Zatim možemo ažurirati svaku težinu.

Možemo povećati ili smanjiti vrijednost težine kako bismo pronašli lokalni minimum naše funkcije gubitka jer znamo nagib. Štoviše, ovaj je postupak iterativni i naziva se Gradient Descent. Povratno razmnožavanje koristi gradijentno spuštanje za širenje ažuriranja težine s kraja na početak mreže.

U ovom uputstvu koristit ćemo algoritam za optimizaciju stohastičkog gradijenta (SGD). Glavna ideja je da nasumično odabiremo seriju slika vlakova u svakom koraku. Zatim primjenjujemo povratno razmnožavanje.

3.5. Metrika ocjenjivanja

Napokon, nakon treninga mreže, moramo dobiti informacije o tome koliko dobro funkcionira naš model.

Metrika koja se najčešće koristi je točnost. Ovo je omjer ispravno klasificiranih slika prema svim slikama. U međuvremenu, opoziv, preciznost i F1 rezultat vrlo su važni mjerni podaci za klasifikaciju slika također.

4. Priprema skupa podataka

U ovom ćemo odjeljku pripremiti slike. Upotrijebimo ugrađeni skup podataka CIFAR10 u ovom vodiču. Stvorit ćemo iteratore za pristup slikama:

javna klasa CifarDatasetService implementira IDataSetService {private CifarDataSetIterator trainIterator; privatni CifarDataSetIterator testIterator; javni CifarDatasetService () {trainIterator = novi CifarDataSetIterator (trainBatch, trainImagesNum, true); testIterator = novi CifarDataSetIterator (testBatch, testImagesNum, false); } // ostale metode i deklaracija polja}

Neke parametre možemo odabrati sami. TrainBatch i testBatch jesu broj slika po vlaku, odnosno stupanj procjene. TrainImagesNum i testImagesNum su brojevi slika za trening i testiranje. Jedna epoha traje trainImagesNum / trainBatch stepenice. Dakle, posjedovanje 2048 slika vlaka s veličinom serije = 32 dovest će do 2048/32 = 64 koraka u jednoj epohi.

5. Konvolucijska neuronska mreža u produbljivanju4j

5.1. Izgradnja modela

Dalje, izradimo naš CNN model od nule. Da biste to učinili, koristit ćemo konvolucijski, poduzorkovanje (udruživanje) i potpuno povezane (guste) slojeve.

Konfiguracija MultiLayerConfiguration = new NeuralNetConfiguration.Builder () .seed (1611) .optimizationAlgo (OptimizationAlgorithm.STOCHASTIC_GRADIENT_DESCENT) .learningRate (properties.getLearningRate ()) .regularization (true) .updaptim. (0, conv5x5 ()) .layer (1, pooling2x2Stride2 ()) .layer (2, conv3x3Stride1Padding2 ()) .layer (3, pooling2x2Stride1 ()) .layer (4, conv3x3Stride1Padding1 ()) 2. )) .sloja (6, gusta ()). priprema (netačno) .backprop (tačno) .setInputType (dataSetService.inputType ()) .build (); mreža = nova MultiLayerNetwork (konfiguracija);

Ovdje navodimo brzinu učenja, algoritam ažuriranja, vrstu unosa našeg modela i slojevitu arhitekturu. Možemo eksperimentirati na tim konfiguracijama. Dakle, možemo trenirati mnogo modela s različitim arhitekturama i parametrima treninga. Nadalje, možemo usporediti rezultate i odabrati najbolji model.

5.2. Obuka modela

Zatim ćemo osposobiti izgrađeni model. To se može učiniti u nekoliko redaka koda:

javni void vlak () {network.init (); IntStream.range (1, epochsNum + 1) .forEach (epoch -> {network.fit (dataSetService.trainIterator ());}); }

Broj epoha je parametar koji sami možemo odrediti. Imamo mali skup podataka. Kao rezultat, bit će dovoljno nekoliko stotina epoha.

5.3. Procjena modela

Napokon, možemo procijeniti sada obučeni model. Biblioteka Deeplearning4j omogućuje to lako:

javna procjena evaluacije () {return network.evaluate (dataSetService.testIterator ()); }

Procjena je objekt koji sadrži izračunate metričke vrijednosti nakon treninga modela. To su točnost, preciznost, opoziv i F1 rezultat. Štoviše, ima prijateljsko sučelje za ispis:

========================== Rezultati ======================= Broj od klase: 11 Točnost: 0,8406 Preciznost: 0,7303 Opoziv: 0,6820 F1 Rezultat: 0,6466 ========================== =============================

6. Zaključak

U ovom vodiču naučili smo o arhitekturi CNN-ovih modela, tehnikama optimizacije i mjernim podacima. Nadalje, implementirali smo model koristeći knjižnicu Deeplearning4j u Javi.

Kao i obično, kôd za ovaj primjer dostupan je na GitHubu.