Ärge kasutage Flatten() – globaalset koondamist CNN-ide jaoks, millel on TensorFlow ja Keras PlatoBlockchain Data Intelligence. Vertikaalne otsing. Ai.

Ärge kasutage Flatten() – globaalne ühendamine CNN-ide jaoks TensorFlow ja Kerasega

Enamik praktikuid, kui nad esimest korda tutvuvad konvolutsioonilise närvivõrgu (CNN) arhitektuuriga, saavad teada, et see koosneb kolmest põhisegmendist:

  • Konvolutsioonilised kihid
  • Kihtide ühendamine
  • Täielikult ühendatud kihid

Enamikul ressurssidest on mõned variatsioon selle segmenteerimise kohta, sealhulgas minu enda raamat. Eriti võrgus – täielikult ühendatud kihid viitavad a tasanduskiht ja (tavaliselt) mitu tihedad kihid.

See oli varem norm ja tuntud arhitektuurid, nagu VGGNets, kasutasid seda lähenemisviisi ja lõppesid järgmiselt:

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')
])

Kuid millegipärast unustatakse sageli, et VGGNet oli praktiliselt viimane arhitektuur, mis seda lähenemisviisi kasutas, kuna see tekitab ilmse arvutusliku kitsaskoha. Niipea kui ResNets, mis avaldati vaid aasta pärast VGGNetsi (ja 7 aastat tagasi), lõpetasid kõik tavaarhitektuurid oma mudelimääratlustega:

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

CNN-ide lamestamine on püsinud juba 7 aastat. 7 aastat! Ja tundub, et liiga vähe inimesi ei räägi kahjulikust mõjust, mida see avaldab nii teie õppimiskogemusele kui ka kasutatavatele arvutusressurssidele.

Globaalne keskmine koondamine on paljudel kontodel eelistatavam kui tasandamine. Kui loote väikese CNN-i prototüüpi, kasutage Global Poolingut. Kui õpetate kellelegi CNN-ide kohta, kasutage Global Poolingut. Kui teete MVP-d, kasutage Global Poolingut. Kasutage tasanduskihte muudel juhtudel, kui neid tegelikult vaja läheb.

Juhtumiuuring – lamestamine vs globaalne koondamine

Global Pooling koondab kõik objektide kaardid üheks kaardiks, koondades kogu asjakohase teabe ühele kaardile, mida saab hõlpsasti mõista ühe tiheda klassifikatsioonikihiga mitme kihi asemel. Tavaliselt kasutatakse seda keskmise koondamisena (GlobalAveragePooling2D) või maksimaalne ühiskasutus (GlobalMaxPooling2D) ja saab töötada ka 1D- ja 3D-sisendi jaoks.

Selle asemel, et tasandada objektikaarti nagu (7, 7, 32) vektorisse pikkusega 1536 ja treenides ühte või mitut kihti, et eristada sellest pikast vektorist mustreid: saame selle koondada (7, 7) vektoriks ja klassifitseerida otse sealt. Nii lihtne see ongi!

Pange tähele, et selliste võrkude nagu ResNets kitsaskohakihid hõlmavad kümneid tuhandeid funktsioone, mitte ainult 1536. Lamendamisel piinate oma võrku, et õppida veidra kujuga vektoritest väga ebaefektiivsel viisil. Kujutage ette, et 2D-kujutis lõigatakse igale pikslireale ja seejärel ühendatakse tasaseks vektoriks. Kaks pikslit, mis varem olid vertikaalselt 0 piksli kaugusel, ei ole seda feature_map_width pikslite kaugusel horisontaalselt! Kuigi see ei pruugi ruumilist muutumatust soodustava klassifitseerimisalgoritmi jaoks liiga oluline olla, pole see teiste arvutinägemise rakenduste jaoks isegi kontseptuaalselt hea.

Määratleme väikese demonstratiivse võrgustiku, mis kasutab paari tiheda kihiga tasanduskihti:

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()

Kuidas kokkuvõte välja näeb?

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

11.5 miljonit parameetrit mänguasjade võrgu jaoks – ja vaadake, kuidas parameetrid plahvatavad suurema sisendiga. 11.5 miljonit parameetrit. EfficientNets, üks parimate toimivustega võrke, mis eales loodud töötab ~6 miljoni parameetriga, ja seda ei saa võrrelda selle lihtsa mudeliga tegeliku jõudluse ja andmetest õppimise võime poolest.

Võiksime seda arvu oluliselt vähendada, muutes võrgu sügavamaks, mis tooks kaasa rohkem maksimaalset ühendamist (ja potentsiaalselt astmelist konvolutsiooni), et vähendada funktsioonikaarte enne nende tasandamist. Mõelge aga sellele, et me muudaksime võrgu keerukamaks, et muuta see arvutuslikult vähem kulukaks, ja seda kõike ainult ühe kihi nimel, mis plaanides mutrivõtit lööb.

Kihtidega süvitsi minnes tuleks eraldada andmepunktide vahel tähendusrikkamad, mittelineaarsed seosed, mitte vähendada sisendi suurust, et rahuldada tasanduskihti.

Siin on globaalse ühiskasutusega võrk:

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()

Kokkuvõte?

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

Palju parem! Kui me läheme selle mudeliga sügavamale, suureneb parameetrite arv ja võib-olla suudame uute kihtidega jäädvustada keerukamaid andmemustreid. Kui seda siiski naiivselt teha, tekivad samad probleemid, mis sidusid VGGNetsidega.

Edasiminek – käeshoitav otsast lõpuni projekt

Sinu uudishimulik loomus tekitab sinus soovi minna kaugemale? Soovitame tutvuda meiega Juhendatud projekt: "Konvolutsioonilised närvivõrgud – väljaspool põhiarhitektuure".

Tutvuge meie praktilise ja praktilise Giti õppimise juhendiga, mis sisaldab parimaid tavasid, tööstusharus aktsepteeritud standardeid ja kaasas olevat petulehte. Lõpetage Giti käskude guugeldamine ja tegelikult õppima seda!

Viin teid ajarännakule – aastatel 1998–2022, toon välja aastate jooksul välja töötatud defineerivad arhitektuurid, mis muutis need ainulaadseks, millised on nende puudused, ning rakendan märkimisväärsed nullist. Pole midagi paremat, kui nende kätel on mustus.

Saate autot juhtida teadmata, kas mootoril on 4 või 8 silindrit ja milline on mootoris olevate ventiilide paigutus. Kui soovite aga mootorit (arvutinägemise mudelit) kujundada ja hinnata, võiksite minna veidi sügavamale. Isegi kui te ei soovi kulutada aega arhitektuuride kujundamisele ja soovite selle asemel tooteid ehitada, mida enamik soovib teha, leiate sellest õppetükist olulist teavet. Saate teada, miks vananenud arhitektuuride, nagu VGGNet, kasutamine kahjustab teie toodet ja jõudlust ning miks peaksite need vahele jätma, kui ehitate midagi kaasaegset, ning saate teada, milliste arhitektuuride abil saate praktilisi probleeme lahendada ja mida. plussid ja miinused on igaühe jaoks.

Kui soovite arvutinägemust oma valdkonnas rakendada, saate selle õppetunni ressursse kasutades leida uusimad mudelid, mõista, kuidas need töötavad ja milliste kriteeriumide alusel saate neid võrrelda ning teha otsuse, mida kasutada. kasutada.

sa ei Arhitektuure ja nende rakendusi tuleb Google'iga otsida – tavaliselt on need paberites väga selgelt lahti seletatud ja Keras-sugused raamistikud muudavad need juurutused lihtsamaks kui kunagi varem. Selle juhendatud projekti peamine eesmärk on õpetada teile arhitektuure ja dokumente leidma, lugema, rakendama ja mõistma. Ükski ressurss maailmas ei suuda kõigi uusimate arengutega sammu pidada. Lisasin siia uusimad paberid – aga mõne kuu pärast ilmuvad uued ja see on paratamatu. Teades, kust leida usaldusväärseid rakendusi, võrrelda neid paberitega ja kohandada, võite anda konkurentsieelise, mida on vaja paljude arvutinägemistoodete jaoks, mida võiksite luua.

Järeldus

Selles lühikeses juhendis oleme vaatlenud alternatiivi CNN-i arhitektuurikujunduse tasandamiseks. Ehkki lühike – juhend käsitleb prototüüpide või MVP-de kujundamisel levinud probleemi ja soovitab kasutada lamestamisele paremat alternatiivi.

Iga kogenud arvutinägemise insener teab ja rakendab seda põhimõtet ning praktikat peetakse iseenesestmõistetavaks. Kahjuks tundub, et seda ei edastata korralikult uutele praktikutele, kes alles valdkonda astuvad, ja võib tekitada kleepuvaid harjumusi, millest vabanemine võtab aega.

Kui hakkate kasutama Computer Visioni, tehke endale teene ja ärge kasutage oma õppeteekonnal enne klassifitseerimispeade tasandavaid kihte.

Ajatempel:

Veel alates Stackabus