Ne használja a Flatten() - Global Pooling-ot a TensorFlow és a Keras PlatoBlockchain adatintelligenciával rendelkező CNN-ekhez. Függőleges keresés. Ai.

Ne használja a Flatten()-t – Globális összevonás CNN-ekhez TensorFlow és Keras segítségével

A legtöbb gyakorló, amikor először tanult a konvolúciós neurális hálózat (CNN) architektúrájáról, megtanulja, hogy az három alapvető szegmensből áll:

  • Konvolúciós rétegek
  • Rétegek összevonása
  • Teljesen összekapcsolt rétegek

A legtöbb erőforrás rendelkezik néhány variáció erre a szegmentációra, beleértve a saját könyvemet is. Különösen online – a teljesen összekapcsolt rétegek a simító réteg és (általában) többszörösen sűrű rétegek.

Korábban ez volt a norma, és a jól ismert architektúrák, például a VGGNets ezt a megközelítést alkalmazták, és a következőképpen végződtek:

model = keras.Sequential([
    
    keras.layers.MaxPooling2D((2, 2), strides=(2, 2), padding='same'),
    keras.layers.Flatten(),
    keras.layers.Dropout(0.5),
    keras.layers.Dense(4096, activation='relu'), 
    keras.layers.Dropout(0.5),
    keras.layers.Dense(4096, activation='relu'),
    keras.layers.Dense(n_classes, activation='softmax')
])

Bár valamiért – gyakran elfelejtik, hogy gyakorlatilag a VGGNet volt az utolsó architektúra, amely ezt a megközelítést alkalmazta, az általa okozott nyilvánvaló számítási szűk keresztmetszet miatt. Amint a VGGNets után egy évvel (és 7 évvel ezelőtt) megjelent ResNets, minden mainstream architektúra a következővel zárta le a modelldefinícióit:

model = keras.Sequential([
    
    keras.layers.GlobalAveragePooling2D(),
    keras.layers.Dense(n_classes, activation='softmax')
])

Az ellaposodás a CNN-ekben 7 éve tart. 7 év! És úgy tűnik, nem elég sokan beszélnek arról, hogy milyen káros hatással van a tanulási tapasztalataira és az Ön által használt számítási erőforrásokra.

A Global Average Pooling sok fióknál előnyösebb, mint az egyenlítés. Ha egy kis CNN-t készít prototípusként, használja a Global Pooling szolgáltatást. Ha valakit a CNN-ekről tanít, használja a Global Pooling-ot. Ha MVP-t szerez, használja a Global Pooling szolgáltatást. Használjon simító rétegeket más felhasználási esetekben, ahol valóban szükség van rájuk.

Esettanulmány – Egyengetés és globális összevonás

A Global Pooling az összes jellemzőtérképet egyetlen térképbe tömöríti, egyetlen térképbe gyűjtve az összes releváns információt, amelyet több réteg helyett egyetlen sűrű osztályozási réteg is könnyen megérthet. Általában átlagos poolingként alkalmazzák (GlobalAveragePooling2D) vagy max pooling (GlobalMaxPooling2D), és 1D és 3D bemenetre is használható.

Ahelyett, hogy egy tereptérképet lapítana, mint pl (7, 7, 32) egy 1536 hosszúságú vektorba, és egy vagy több réteget tanítunk, hogy megkülönböztethessük a mintákat ebből a hosszú vektorból: sűríthetjük egy (7, 7) vektort, és közvetlenül onnan osztályozzuk. Ez ennyire egyszerű!

Ne feledje, hogy az olyan hálózatok szűk keresztmetszeti rétegei, mint a ResNets, több tízezer szolgáltatást jelentenek, nem csupán 1536-ot. A kiegyenlítés során megkínozza a hálózatot, hogy tanuljon a furcsa alakú vektorokból, nagyon nem hatékony módon. Képzeljen el egy 2D-s képet, amely minden pixelsoron fel van vágva, majd egy lapos vektorba fűzi össze. A két képpont, amelyek korábban függőlegesen 0 pixel távolságra voltak egymástól, nem feature_map_width pixel távolságra vízszintesen! Noha ez nem számít túl sokat egy osztályozási algoritmus számára, amely a térbeli változatlanságot részesíti előnyben, ez még fogalmilag sem lenne jó a számítógépes látás más alkalmazásainál.

Definiáljunk egy kis demonstrációs hálózatot, amely egy simító réteget használ néhány sűrű réteggel:

model = keras.Sequential([
    keras.layers.Input(shape=(224, 224, 3)),
    keras.layers.Conv2D(32, (3, 3), activation='relu'),
    keras.layers.Conv2D(32, (3, 3), activation='relu'),
    keras.layers.MaxPooling2D((2, 2), (2, 2)),
    keras.layers.BatchNormalization(),
    keras.layers.Conv2D(64, (3, 3), activation='relu'),
    keras.layers.Conv2D(64, (3, 3), activation='relu'),
    keras.layers.MaxPooling2D((2, 2), (2, 2)),
    keras.layers.BatchNormalization(),
    keras.layers.Flatten(),
    keras.layers.Dropout(0.3),
    keras.layers.Dense(64, activation='relu'),
    keras.layers.Dense(32, activation='relu'),
    keras.layers.Dense(10, activation='softmax')
])
model.summary()

Hogyan néz ki az összefoglaló?

...                                                              
 dense_6 (Dense)             (None, 10)                330       
                                                                 
=================================================================
Total params: 11,574,090
Trainable params: 11,573,898
Non-trainable params: 192
_________________________________________________________________

11.5 millió paraméter egy játékhálózathoz – és figyelje a paraméterek robbanását nagyobb bemenettel. 11.5 millió paraméter. Az EfficientNets, az egyik legjobban teljesítő hálózat, amelyet valaha terveztek, ~6 millió paraméterrel működik, és nem hasonlítható össze ezzel az egyszerű modellel a tényleges teljesítmény és az adatokból való tanulás képessége tekintetében.

Jelentősen csökkenthetnénk ezt a számot a hálózat mélyebbé tételével, ami több max pooling-et (és potenciálisan lépcsőzetes konvolúciót) vezetne be, hogy csökkentse a jellemzőtérképeket, mielőtt azok laposodnának. Azonban vegyük fontolóra, hogy bonyolultabbá tennénk a hálózatot, hogy számításilag kevésbé költséges legyen, mindezt egyetlen réteg kedvéért, amely csavarkulcsot dob ​​a tervekben.

Mélyebbre kell lépni a rétegekkel, hogy értelmesebb, nem lineáris kapcsolatokat vonjunk ki az adatpontok között, és ne csökkentsük a bemeneti méretet, hogy megfeleljen egy ellaposodó rétegnek.

Íme egy hálózat globális poolinggel:

model = keras.Sequential([
    keras.layers.Input(shape=(224, 224, 3)),
    keras.layers.Conv2D(32, (3, 3), activation='relu'),
    keras.layers.Conv2D(32, (3, 3), activation='relu'),
    keras.layers.MaxPooling2D((2, 2), (2, 2)),
    keras.layers.BatchNormalization(),
    keras.layers.Conv2D(64, (3, 3), activation='relu'),
    keras.layers.Conv2D(64, (3, 3), activation='relu'),
    keras.layers.MaxPooling2D((2, 2), (2, 2)),
    keras.layers.BatchNormalization(),
    keras.layers.GlobalAveragePooling2D(),
    keras.layers.Dropout(0.3),
    keras.layers.Dense(10, activation='softmax')
])

model.summary()

Összegzés?

 dense_8 (Dense)             (None, 10)                650       
                                                                 
=================================================================
Total params: 66,602
Trainable params: 66,410
Non-trainable params: 192
_________________________________________________________________

Sokkal jobb! Ha mélyebbre megyünk ezzel a modellel, a paraméterek száma növekedni fog, és az új rétegekkel bonyolultabb adatmintákat tudunk rögzíteni. Ha azonban naivan csináljuk, ugyanazok a problémák merülnek fel, amelyek a VGGNeteket kötötték.

Tovább haladva – kézi, végponttól végpontig projekt

Érdeklődő természete arra készteti, hogy tovább menjen? Javasoljuk, hogy tekintse meg nálunk Irányított projekt: „Konvolúciós neurális hálózatok – az alapvető architektúrákon túl”.

Tekintse meg gyakorlatias, gyakorlati útmutatónkat a Git tanulásához, amely tartalmazza a bevált gyakorlatokat, az iparág által elfogadott szabványokat és a mellékelt csalólapot. Hagyd abba a guglizást a Git parancsokkal, és valójában tanulni meg!

Elviszlek egy kis időutazásra – 1998-tól 2022-ig, kiemelve az évek során kifejlesztett meghatározó architektúrákat, mi tette őket egyedivé, mik a hátrányaik, és a nevezeteseket a semmiből valósítom meg. Nincs is jobb annál, mint egy kis kosz a kezében, amikor ezekről van szó.

Vezethetsz egy autót anélkül, hogy tudnád, hogy a motor 4 vagy 8 hengeres, és hogy mi a szelepek elhelyezkedése a motoron belül. Ha azonban egy motort (számítógépes látásmodell) szeretne megtervezni és értékelni, akkor egy kicsit mélyebbre kell mennie. Még ha nem is szeretne időt tölteni az architektúrák tervezésével, hanem inkább termékeket szeretne építeni, amit a legtöbben szeretne megtenni – ebben a leckében fontos információkat talál. Megtudhatja, hogy az elavult architektúrák, például a VGGNet használata miért rontja a termékét és a teljesítményét, és miért érdemes ezeket kihagyni, ha valami modern építkezést készít, valamint megtudhatja, hogy mely architektúrákat használhatja gyakorlati problémák megoldására, és mit az előnyök és a hátrányok mindegyiknek megvannak.

Ha a számítógépes látásmódot szeretné alkalmazni a szakterületén, ennek a leckének az erőforrásait felhasználva megtalálhatja a legújabb modelleket, megértheti, hogyan működnek, és milyen kritériumok alapján hasonlíthatja össze őket, és eldöntheti, hogy melyiket használja. használat.

te nem Az architektúrákat és azok megvalósításait a Google-nak kell keresnie – ezek általában nagyon világosan le vannak magyarázva a dokumentumokban, és az olyan keretrendszerek, mint a Keras, egyszerűbbé teszik ezeket a megvalósításokat, mint valaha. Ennek az irányított projektnek az a legfontosabb eleme, hogy megtanítsa Önt architektúrák és dokumentumok megtalálására, olvasására, megvalósítására és megértésére. A világ egyetlen erőforrása sem lesz képes lépést tartani a legújabb fejlesztésekkel. A legfrissebb újságokat feltettem ide – de néhány hónapon belül újak fognak megjelenni, és ez elkerülhetetlen. Ha tudja, hol találhat hiteles megvalósításokat, hasonlítsa össze azokat a papírokkal és módosítsa rajtuk, akkor versenyelőnyt biztosíthat számos számítógépes látástermékhez, amelyet esetleg meg szeretne építeni.

Következtetés

Ebben a rövid útmutatóban a CNN architektúra tervezésében a lapítás alternatíváját vettük szemügyre. Bár rövid, az útmutató a prototípusok vagy az MVP-k tervezése során felmerülő gyakori problémákkal foglalkozik, és azt tanácsolja, hogy a lapítás helyett használjon jobb alternatívát.

Minden tapasztalt Computer Vision mérnök ismeri és alkalmazza ezt az elvet, és a gyakorlat magától értetődőnek tekinthető. Sajnos úgy tűnik, hogy nem közvetítik megfelelően az újonnan pályára lépő gyakorló szakemberek felé, és olyan ragadós szokásokat alakíthat ki, amelyektől egy ideig megszabadulni.

Ha a Computer Vision programba kezd, tegyen magának egy szívességet, és ne használjon simító rétegeket az osztályozási fejek előtt a tanulási útja során.

Időbélyeg:

Még több Stackabus