Ako implementovať CNN pomocou Deeplearning4j

1. Prehľad

V tomto výučbe to urobíme budovať a trénovať konvolučnú neurónovú sieť model využívajúci knižnicu Deeplearning4j v Jave.

Ďalšie informácie o tom, ako zriadiť knižnicu, nájdete v našej príručke Deeplearning4j.

2. Klasifikácia obrázkov

2.1. Vyhlásenie o probléme

Predpokladajme, že máme sadu obrázkov. Každý obrázok predstavuje objekt konkrétnej triedy. Objekt na obrázku navyše patrí do jedinej známej triedy. Takže problémové vyhlásenie je zostaviť model, ktorý bude schopný rozpoznať triedu objektu na danom obrázku.

Povedzme napríklad, že máme súbor obrázkov s desiatimi gestami ruky. Staviame model a trénujeme ho, aby sme ich mohli klasifikovať. Potom po tréningu môžeme odovzdať ďalšie obrázky a klasifikovať na ne gestá rúk. Dané gesto by samozrejme malo patriť do známych tried.

2.2. Reprezentácia obrazu

V pamäti počítača môže byť obraz znázornený ako matica čísel. Každé číslo má hodnotu pixelu v rozmedzí od 0 do 255.

Obrázok v stupňoch šedej je 2D matica. Podobne je obrázkom RGB 3D matica s rozmermi šírky, výšky a hĺbky.

Ako môžeme vidieť, obrázok je súbor čísel. Preto môžeme zostaviť viacvrstvové sieťové modely, ktoré ich naučia triediť obrázky.

3. Konvolučné neurónové siete

Konvolučná neurónová sieť (CNN) je viacvrstvový sieťový model, ktorý má špecifickú štruktúru. Štruktúru CNN možno rozdeliť do dvoch blokov: konvolučné vrstvy a úplne spojené (alebo husté) vrstvy. Pozrime sa na každú z nich.

3.1. Konvolučná vrstva

Každý konvolučná vrstva je sada štvorcových matíc, ktorá sa nazýva jadro. Predovšetkým ich potrebujeme na vykonanie konvolúcie na vstupnom obraze. Ich množstvo a veľkosť sa môžu líšiť v závislosti od daného súboru údajov. Väčšinou používame jadrá 3 × 3 alebo 5 × 5, zriedka aj 7 × 7. Presná veľkosť a množstvo sa vyberajú metódou pokusu a omylu.

Okrem toho náhodne vyberieme premenné matíc jadra na začiatku vlaku. Sú váhami siete.

Na vykonanie konvolúcie môžeme ako posuvné okno použiť jadro. Znásobíme váhy jadra na zodpovedajúce obrazové pixely a vypočítame súčet. Potom môžeme presunúť jadro tak, aby pokrylo ďalší kúsok obrázka pomocou krokov (pohyb vpravo) a výplne (pohyb dole). Vo výsledku budeme mať hodnoty, ktoré sa použijú v ďalších výpočtoch.

V skratke, s touto vrstvou dostaneme konvolvný obraz. Niektoré premenné môžu byť menšie ako nula. To zvyčajne znamená, že tieto premenné sú menej dôležité ako ostatné. Preto je použitie funkcie ReLU dobrým prístupom k ďalšiemu znižovaniu počtu výpočtov.

3.2. Vrstva podvzorkovania

Vrstva podvzorkovania (alebo združovania) je vrstva siete, ktorá sa zvyčajne používa po konvolučnej. Po konvolúcii dostaneme veľa vypočítaných premenných. Našou úlohou je však spomedzi nich vybrať to najcennejšie.

Prístup spočíva v použití algoritmu posuvného okna na konvolvovaný obraz. V každom kroku zvolíme maximálnu hodnotu v štvorcovom okne preddefinovanej veľkosti, zvyčajne medzi 2 × 2 a 5 × 5 pixelov. Vo výsledku budeme mať menej vypočítaných parametrov. Preto to zníži výpočty.

3.3. Hustá vrstva

Hustá (alebo úplne spojená) vrstva je vrstva, ktorá sa skladá z viacerých neurónov. Túto vrstvu potrebujeme na vykonanie klasifikácie. Navyše môžu existovať dve alebo viac takýchto následných vrstiev. Dôležité je, že posledná vrstva by mala mať veľkosť rovnú počtu tried na klasifikáciu.

Výstupom siete je pravdepodobnosť obrazu patriaceho do každej z tried. Na predpovedanie pravdepodobností použijeme aktivačnú funkciu Softmax.

3.4. Optimalizačné techniky

Aby sme mohli trénovať, musíme optimalizovať váhy. Pamätajte, že tieto premenné vyberieme spočiatku náhodne. Neurónová sieť je veľká funkcia. A má veľa neznámych parametrov, naše váhy.

Keď odovzdáme obrázok sieti, dá nám odpoveď. Potom môžeme vybudovať stratovú funkciu, ktorá bude závisieť od tejto odpovede. Pokiaľ ide o učenie pod dohľadom, máme aj skutočnú odpoveď - skutočnú triedu. Náš úlohou je minimalizovať túto stratovú funkciu. Ak uspejeme, náš model je dobre vyškolený.

Aby sme minimalizovali túto funkciu, musíme aktualizovať váhy siete. Aby sme to dosiahli, môžeme vypočítať deriváciu stratovej funkcie vzhľadom na každý z týchto neznámych parametrov. Potom môžeme každú váhu aktualizovať.

Môžeme zvýšiť alebo znížiť hodnotu hmotnosti, aby sme našli lokálne minimum našej stratovej funkcie, pretože poznáme sklon. Navyše, tento proces je iteračný a nazýva sa gradientový zostup. Backpropagation využíva gradientový zostup na šírenie aktualizácie hmotnosti z konca na začiatok siete.

V tomto tutoriále použijeme optimalizačný algoritmus Stochastic Gradient Decent (SGD). Hlavná myšlienka je, že v každom kroku náhodne vyberieme sériu obrázkov vlakov. Potom aplikujeme spätné šírenie.

3.5. Hodnotiace metriky

Nakoniec po školení siete musíme získať informácie o tom, ako dobre náš model funguje.

Najčastejšie používanou metrikou je presnosť. Toto je pomer správne klasifikovaných snímok k všetkým snímkam. Medzitým pripomenutie, presnosť a skóre F1 sú veľmi dôležité metriky pre klasifikáciu obrázkov tiež.

4. Príprava datasetu

V tejto časti pripravíme obrázky. V tomto návode použijeme vložený súbor údajov CIFAR10. Vytvoríme iterátory pre prístup k obrázkom:

verejná trieda CifarDatasetService implementuje IDataSetService {private CifarDataSetIterator trainIterator; private CifarDataSetIterator testIterator; public CifarDatasetService () {trainIterator = nový CifarDataSetIterator (trainBatch, trainImagesNum, true); testIterator = nový CifarDataSetIterator (testBatch, testImagesNum, false); } // ďalšie deklarácie metód a polí}

Niektoré parametre si môžeme zvoliť sami. TrainBatch a testBatch sú počty obrázkov na vlak a krok vyhodnotenia. TrainImagesNum a testImagesNum sú počty obrázkov na školenie a testovanie. Jedna epocha trvá trainImagesNum / vlakDávka krokov. Takže mať 2048 obrázkov vlakov s veľkosťou dávky = 32 povedie k 2048/32 = 64 krokom v jednej epoche.

5. Konvolučná neurónová sieť v deeplearningu4j

5.1. Budovanie modelu

Ďalej zostavíme náš model CNN od nuly. Urobiť to, použijeme konvolučné, podvzorkovanie (združovanie) a úplne spojené (husté) vrstvy.

Konfigurácia MultiLayerConfiguration = nový NeuralNetConfiguration.Builder () .seed (1611) .optimizationAlgo (OptimizationAlgorithm.STOCHASTIC_GRADIENT_DESCENT) .learningRate (properties.getLearningRate ()) .regularization (true) .updim (vlastnosti) .updater (vlastnosti) .updater (vlastnosti) (0, conv5x5 ()) .layer (1, pooling2x2Stride2 ()) .layer (2, conv3x3Stride1Padding2 ()) .layer (3, pooling2x2Stride1 ()) .layer (4, conv3x3Stride1Padding1 ()) .layer (5, pooling2x2Stride1 ( )) .layer (6, thick ()) .pretrain (false) .backprop (true) .setInputType (dataSetService.inputType ()) .build (); sieť = nová MultiLayerNetwork (konfigurácia);

Tu určujeme rýchlosť učenia, aktualizačný algoritmus, typ vstupu nášho modelu a architektúru vrstiev. Na týchto konfiguráciách môžeme experimentovať. Môžeme teda trénovať veľa modelov s rôznymi architektúrami a tréningovými parametrami. Ďalej môžeme porovnať výsledky a zvoliť najlepší model.

5.2. Školenie modelu

Potom trénujeme zostavený model. To je možné vykonať v niekoľkých riadkoch kódu:

public void train () {network.init (); IntStream.range (1, epochsNum + 1) .forEach (epocha -> {network.fit (dataSetService.trainIterator ());}); }

Počet epoch je parameter, ktorý si môžeme sami určiť. Máme malý súbor údajov. Vo výsledku bude stačiť niekoľko stovák epoch.

5.3. Vyhodnocovanie modelu

Na záver môžeme vyhodnotiť teraz trénovaný model. Knižnica Deeplearning4j poskytuje schopnosť robiť to ľahko:

public Evaluation evalu () {return network.evaluate (dataSetService.testIterator ()); }

Vyhodnotenie je objekt, ktorý po vypočítaní modelu obsahuje vypočítané metriky. Tie sú presnosť, presnosť, vyvolanie a skóre F1. Okrem toho má priateľské tlačiteľné rozhranie:

=========================== skóre ===================== počet triedy: 11 Presnosť: 0,8406 Presnosť: 0,7303 Odvolanie: 0,6820 F1 Skóre: 0,6466 =========================== ============================

6. Záver

V tomto tutoriáli sme sa dozvedeli o architektúre modelov CNN, technikách optimalizácie a metrikách hodnotenia. Ďalej sme model implementovali pomocou knižnice Deeplearning4j v Jave.

Ako obvykle je kód pre tento príklad k dispozícii na GitHub.


$config[zx-auto] not found$config[zx-overlay] not found