Hogyan lehet megvalósítani a CNN-t a Deeplearning4j segítségével

1. Áttekintés

Ebben az oktatóanyagban megtesszük konvolúciós ideghálózat kiépítése és kiképzése modell a Java Deeplearning4j könyvtárának használatával.

A könyvtár felállításával kapcsolatos további információkért olvassa el a Deeplearning4j útmutatónkat.

2. Képosztályozás

2.1. Probléma nyilatkozat

Tegyük fel, hogy van egy sor képünk. Minden kép egy adott osztály objektumát ábrázolja. Sőt, a képen látható objektum az egyetlen ismert osztályba tartozik. Így, a problémamegállapítás az a modell felépítése, amely képes felismerni az objektum osztályát az adott képen.

Tegyük fel például, hogy van egy képsorunk tíz kézmozdulattal. Felépítünk egy modellt és kiképezzük őket osztályozásukra. Ezután edzés után átadhatunk más képeket, és osztályozhatjuk rajtuk a kézmozdulatokat. Természetesen az adott gesztusnak az ismert osztályokba kell tartoznia.

2.2. Képábrázolás

A számítógép memóriájában a kép számmátrixként ábrázolható. Minden szám pixelérték, 0 és 255 között.

A szürkeárnyalatos kép 2D-s mátrix. Hasonlóképpen, az RGB kép egy 3D mátrix szélesség, magasság és mélység méretekkel.

Mint láthatjuk, a kép számhalmaz. Ezért többrétegű hálózati modelleket készíthetünk a képek osztályozására.

3. Konvolúciós neurális hálózatok

A konvolúciós neurális hálózat (CNN) egy többrétegű hálózati modell, amelynek sajátos szerkezete van. A CNN szerkezete két blokkra osztható: konvolúciós és teljesen összekapcsolt (vagy sűrű) rétegekre. Nézzük meg mindegyiket.

3.1. Konvolúciós réteg

Minden egyes a konvolúciós réteg négyzetmátrixok halmaza, az úgynevezett kernelek. Mindenekelőtt szükségünk van rájuk, hogy konvolúciót hajtsanak végre a bemeneti képen. Mennyiségük és méretük az adott adatkészlettől függően változhat. Leginkább 3 × 3 vagy 5 × 5 magot használunk, és ritkán 7 × 7 magot. A pontos méretet és összeget próbával és hibával választják ki.

Ezenkívül véletlenszerűen kiválasztjuk a kernelmátrixok változóit a vonat elején. Ők a hálózat súlyai.

A konvolúció végrehajtásához a kernelt használhatjuk csúszó ablakként. Megszorozzuk a kernel súlyát a megfelelő képpontokkal, és kiszámoljuk az összeget. Ezután lépésről lépésre (jobbra mozgatás) és párnázással (lefelé mozgatás) mozgathatjuk a kernelt, hogy eltakarja a kép következő részét. Ennek eredményeként rendelkezünk olyan értékekkel, amelyeket a további számítások során felhasználunk.

Röviden, ezzel a réteggel összevont képet kapunk. Egyes változók nullánál kisebbek lehetnek. Ez általában azt jelenti, hogy ezek a változók kevésbé fontosak, mint a többi. Ezért a ReLU függvény alkalmazása jó megközelítés a további számítások elvégzéséhez.

3.2. Almintavételi réteg

Az almintavételi (vagy pooling) réteg a hálózat olyan rétege, amelyet általában a konvolúciós réteg után használnak. A konvolúció után sok kiszámított változót kapunk. Feladatunk azonban a legértékesebb kiválasztása közülük.

A megközelítés az, hogy egy csúszóablak-algoritmust alkalmazzunk az összevont képre. Minden lépésnél kiválasztjuk a négyzet ablakban egy előre meghatározott méret maximális értékét, általában 2 × 2 és 5 × 5 képpont között. Ennek eredményeként kevesebb számított paraméterünk lesz. Ezért ez csökkenti a számításokat.

3.3. Sűrű réteg

A sűrű (vagy teljesen összekapcsolt) réteg több neuronból áll. Erre a rétegre van szükségünk az osztályozás elvégzéséhez. Sőt, két vagy több ilyen következményes réteg lehet. Fontos, hogy az utolsó réteg méretének meg kell egyeznie az osztályozás osztályainak számával.

A hálózat kimenete az egyes osztályokhoz tartozó kép valószínűsége. A valószínűségek előrejelzéséhez a Softmax aktiválási funkciót fogjuk használni.

3.4. Optimalizálási technikák

Az edzés elvégzéséhez optimalizálnunk kell a súlyokat. Ne feledje, hogy véletlenszerűen választjuk ki ezeket a változókat kezdetben. Az ideghálózat nagy funkció. És rengeteg ismeretlen paraméterrel rendelkezik, a súlyainkkal.

Amikor képet adunk át a hálózatnak, az megadja a választ. Akkor lehet építsen egy veszteségfüggvényt, amely ettől a választól függ. A felügyelt tanulás tekintetében van egy tényleges válaszunk is - az igaz osztály. A mi küldetése, hogy minimalizálja ezt a veszteség funkciót. Ha sikerül, akkor modellünk jól képzett.

A funkció minimalizálása érdekében frissítenünk kell a hálózat súlyát. Ennek érdekében kiszámíthatjuk a veszteségfüggvény deriváltját ezen ismeretlen paraméterek mindegyikére vonatkozóan. Ezután frissíthetjük az egyes súlyokat.

Növelhetjük vagy csökkenthetjük a súlyértéket, hogy megtaláljuk veszteségfüggvényünk helyi minimumát, mert ismerjük a lejtést. Ráadásul, ez a folyamat iteratív, és gradiens süllyedésnek hívják. A háttérpropagáció gradiens ereszkedést használ a súlyfrissítés terjesztéséhez a hálózat végétől a elejéig.

Ebben az oktatóanyagban a Stochastic Gradient Decent (SGD) optimalizálási algoritmust fogjuk használni. A fő gondolat az, hogy véletlenszerűen választjuk meg a vonatképek sorozatát minden lépésnél. Ezután visszaszaporítást alkalmazunk.

3.5. Értékelési mutatók

Végül a hálózat kiképzése után információt kell szereznünk arról, hogy mennyire teljesít a modellünk.

A legtöbbször használt mutató a pontosság. Ez a helyesen osztályozott képek aránya az összes képhez. Közben, a visszahívás, a pontosság és az F1-pontszám nagyon fontos mérőszám a képosztályozás szempontjából is.

4. Adatkészlet előkészítése

Ebben a részben elkészítjük a képeket. Használjuk a beágyazott CIFAR10 adatkészletet ebben az oktatóanyagban. Iterátorokat hozunk létre a képek eléréséhez:

public class CifarDatasetService implementálja az IDataSetService {private CifarDataSetIterator trainIterator; privát CifarDataSetIterator testIterator; public CifarDatasetService () {trainIterator = new CifarDataSetIterator (trainBatch, trainImagesNum, true); testIterator = new CifarDataSetIterator (testBatch, testImagesNum, hamis); } // egyéb módszerek és mezők deklarációja}

Néhány paramétert egyedül választhatunk. TrainBatch és testBatch a képek száma vonatonként, illetve az értékelési lépés. TrainImagesNum és testImagesNum az edzéshez és teszteléshez szükséges képek száma. Egy korszak tart trainImagesNum / trainBatch lépések. Tehát, ha 2048 vonatkép van, amelynek kötegmérete = 32, akkor 2048/32 = 64 lépés lesz egy korszakonként.

5. Konvolúciós neurális hálózat a Deeplearningben4j

5.1. A modell felépítése

Ezután építsük fel teljesen a CNN modellünket. Csinálni, konvolúciós, almintavételi (pooling) és teljesen összekapcsolt (sűrű) rétegeket fogunk használni.

MultiLayerConfiguration configuration = new NeuralNetConfiguration.Builder () .seed (1611) .optimizationAlgo (OptimizationAlgorithm.STOCHASTIC_GRADIENT_DESCENT) .learningRate (properties.getLearningRate ()). Regularization (true) .updater (properties.getOpt. (0, conv5x5 ()) .layer (1, pooling2x2Stride2 ()) .layer (2, conv3x3Stride1Padding2 ()) .layer (3, pooling2x2Stride1 ()) .layer (4, conv3x3Stride1Padding1 ()) .layer (5, pooling2x2Stride1x2) )) .layer (6, dense ()) .pretrain (false) .backprop (true) .setInputType (dataSetService.inputType ()) .build (); hálózat = new MultiLayerNetwork (konfiguráció);

Itt adjuk meg a tanulási sebességet, a frissítési algoritmust, a modellünk bemeneti típusát és a réteges architektúrát. Kísérletezhetünk ezeken a konfigurációkon. Így sokféle architektúrát és képzési paramétert tartalmazó modellt képezhetünk. Továbbá összehasonlíthatjuk az eredményeket és kiválaszthatjuk a legjobb modellt.

5.2. A modell kiképzése

Ezután kiképezzük az épített modellt. Ezt meg lehet tenni néhány kódsorban:

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

A korszakok száma az a paraméter, amelyet mi magunk is megadhatunk. Van egy kis adatkészletünk. Ennek eredményeként több száz korszak is elegendő lesz.

5.3. A modell értékelése

Végül értékelhetjük a már betanított modellt. A Deeplearning4j könyvtár lehetőséget kínál arra, hogy ezt könnyen megtehesse:

nyilvános értékelés értékelje () {return network.evaluate (dataSetService.testIterator ()); }

Értékelés egy objektum, amely a modell betanítása után számított metrikákat tartalmaz. Ezek pontosság, pontosság, visszahívás és az F1 pontszám. Ezenkívül barátságos nyomtatható felülettel rendelkezik:

========================== Pontszám ======================= osztályok: 11 Pontosság: 0,8406 Pontosság: 0,7303 Visszahívás: 0,6820 F1 Pontszám: 0,6466 =========================== ===========================

6. Következtetés

Ebben az oktatóanyagban megismertük a CNN-modellek architektúráját, az optimalizálási technikákat és az értékelési mutatókat. Ezenkívül a modellt a Java Deeplearning4j könyvtárának segítségével valósítottuk meg.

Szokás szerint ennek a példának a kódja elérhető a GitHubon.