- Introduction
- Tartalomjegyzék
- CNN-ek használata kézzel írt számjegyek osztályozására az MNIST adathalmazon
- Identifying Images from the CIFAR-10 Dataset using CNNs
- Itt van, mit változtattam a modellben:
- Az ImageNet képeinek kategorizálása CNN-ek segítségével
- Az ImageNet-adatbázisról
- Ez az, ahol a Fast.ai Imagenette-adatkészlete jön a képbe
- Download the Imagenette Dataset
- Képek betöltése az ImageDataGenerator használatával
- Egy alapvető CNN modell építése képosztályozáshoz
- A transzfer tanulás (VGG16) használata a pontosság javítására
- VGG16 súlyainak letöltése
- Jellemzők generálása a VGG16-ból
- Hova tovább?
Introduction
Convolutional neural networks (CNN) – the concept behind recent breakthroughs and developments in deep learning.
CNNs have broken the mold and ascelled the throne to become the state-of-the-art computer vision technique. A neurális hálózatok különböző típusai közül (a többiek közé tartoznak a rekurrens neurális hálózatok (RNN), a hosszú rövid távú memória (LSTM), a mesterséges neurális hálózatok (ANN) stb.) a CNN-ek könnyen a legnépszerűbbek.
Ezek a konvolúciós neurális hálózati modellek mindenütt jelen vannak a képi adattérben. Fenomenálisan jól működnek olyan számítógépes látási feladatokban, mint a képosztályozás, objektumdetektálás, képfelismerés stb.
Szóval – hol lehet gyakorolni a CNN-ek ismereteit? Nos, a legjobb helyen jársz!
Vanak különböző adathalmazok, amelyeket felhasználhatsz a konvolúciós neurális hálózatok alkalmazásához. Íme három népszerű adatkészlet:
- MNIST
- CIFAR-10
- ImageNet
Ebben a cikkben képosztályozó modelleket fogunk építeni CNN segítségével az egyes adatkészleteken. Így van! Az MNSIT, a CIFAR-10 és az ImageNet adatbázist fogjuk megvizsgálni, hogy gyakorlatias módon megértsük, hogyan működnek a CNN-ek a képosztályozási feladatokban.
Ezzel az ingyenes tanfolyammal mindent megtudhat a konvolúciós neurális hálózatokról(CNN): Convolutional Neural Networks (CNN) from Scratch
A cikk megírását az inspirálta, hogy segítsek a közösségnek az elméleti tudás gyakorlati alkalmazásában. Ez egy nagyon fontos gyakorlat, mivel nem csak az alapkoncepció mélyebb megértését segíti elő, hanem olyan gyakorlati részletekre is megtanít, amelyeket csak a koncepció megvalósításával lehet megtanulni.
Ha új vagy a neurális hálózatok, CNN-ek, képosztályozás világában, ajánlom, hogy nézd át ezeket a kiváló, mélyreható oktatóanyagokat:
- Elvezetés a neurális hálózatokba (ingyenes tanfolyam!)
- Dememystifying the Mathematics behind Convolutional Neural Networks (CNNs)
- Build your First Image Classification Model in just 10 Minutes
És ha mélyrehatóan szeretnéd megtanulni a számítógépes látást és a mély tanulást, akkor nézd meg népszerű tanfolyamainkat:
- Computer Vision using Deep Learning
- Certified AI & ML Blackbelt+ Program
Tartalomjegyzék
- Using CNNs to Classify Hand-written Digits on MNIST Dataset
- Identifying Images from CIFAR-10 Dataset using CNNs
- Categorizing Images of ImageNet Dataset using CNNs
- Where to go from here?
Megjegyzés: Ebben a cikkben a Keras-t fogom használni a CNN-ek segítségével történő képosztályozás bemutatására. A Keras egy kiváló keretrendszer, amit érdemes megtanulni, amikor a mélytanulással kezdünk foglalkozni.
CNN-ek használata kézzel írt számjegyek osztályozására az MNIST adathalmazon
A MNIST (Modified National Institute of Standards and Technology) egy jól ismert, a számítógépes látásban használt adathalmaz, amelyet Yann Le Cun et. al. Kézzel írt számjegyeket (0-9) ábrázoló képekből áll, amelyeket egy 50 000 képből álló gyakorlóhalmazra és egy 10 000 képből álló teszthalmazra osztottak fel, ahol minden kép 28 x 28 pixel széles és magas.
Ezt az adathalmazt gyakran használják bármely képosztályozásra készült algoritmus gyakorlásához, mivel az adathalmaz viszonylag könnyen meghódítható. Ezért azt javaslom, hogy ez legyen az első adatkészleted, ha még csak most próbálod ki magad a területen.
A MNIST alapértelmezésben Keras-szal érkezik, és egyszerűen betöltheted a train és a test fájlokat néhány sor kód segítségével:
Itt van az X (jellemzők) és y (cél) alakja a képzési és validálási adatokhoz:
X_train shape (60000, 28, 28) y_train shape (60000,) X_test shape (10000, 28, 28) y_test shape (10000,)
Mielőtt CNN modellt képeznénk, építsünk egy alapvető Fully Connected Neural Network-et az adatkészlethez. A képosztályozó modell neurális hálózat segítségével történő felépítésének alapvető lépései a következők:
- Lapítsuk a bemeneti kép dimenzióit 1D-re (szélesség pixel x magasság pixel)
- Normáljuk a kép pixelértékeit (osszuk el 255-tel)
- Egy…Hot Encode the categorical column
- Build a model architecture (Sequential) with Dense layers
- Train the model and make predictions
Itt van, hogyan lehet felépíteni egy neurális hálózati modellt az MNIST számára. A jobb megértés érdekében kommentáltam a kód releváns részeit:
A fenti kód futtatása után rájött, hogy könnyen elérjük a 97% körüli validálási pontosságot.
Módosítsuk a fenti kódot egy CNN modell létrehozásához.
A CNN-ek használatának egyik nagy előnye az NN-ekkel szemben, hogy nem kell a bemeneti képeket 1D-re lapítani, mivel képesek 2D-s képadatokkal dolgozni. Ez segít a képek “térbeli” tulajdonságainak megőrzésében.
Itt a CNN-modell teljes kódja:
Noha a maximális validálási pontosságunk egy egyszerű neurális hálózati modell használatával 97% körüli volt, a CNN-modell egyetlen konvolúciós réteggel 98% feletti eredményre képes!
Elmehetünk előre, és további Conv2D rétegeket adhatunk hozzá, és játszhatunk a CNN-modell hiperparamétereivel is.
Identifying Images from the CIFAR-10 Dataset using CNNs
A CNIST egy kezdőbarát adathalmaz a számítógépes látás területén. Könnyű 90% feletti eredményt elérni a validáláson egy CNN modell használatával. De mi van akkor, ha már túl vagyunk a kezdőkön, és valami kihívásra van szükségünk ahhoz, hogy a fogalmainkat hasznosítani tudjuk?
Itt jön a képbe a CIFAR-10 adathalmaz!
Íme, ahogy a CIFAR (Canadian Institute For Advanced Research) mögött álló fejlesztők leírják az adathalmazt:
A CIFAR-10 adathalmaz 60 000 32 x 32 színes képből áll, 10 osztályban, osztályonként 6000 képpel. Van 50 000 gyakorló kép és 10 000 tesztkép.
Azok a fontos pontok, amelyek megkülönböztetik ezt az adathalmazt az MNIST-től:
- A képek a CIFAR-10-ben színezettek, szemben az MNIST fekete-fehér textúrájával
- Minden kép 32 x 32 pixeles
- 50 000 gyakorló kép és 10 000 tesztkép
Most, ezek a képek különböző fényviszonyok között és különböző szögekből készültek, és mivel ezek színes képek, látni fogjuk, hogy a hasonló tárgyak (például az óceánvíz színe) színében önmagában is sok eltérés van. Ha azt az egyszerű CNN-architektúrát használja, amelyet a fenti MNIST példában láttunk, akkor alacsony, 60% körüli validálási pontosságot fog kapni.
Ez az egyik fő oka annak, hogy a CIFAR-10-et jó adatkészletként ajánlom a CNN-ek hiperparaméter-hangolási készségeinek gyakorlására. A jó dolog az, hogy az MNIST-hez hasonlóan a CIFAR-10 is könnyen elérhető a Kerasban.
Egyszerűen betöltheted az adathalmazt a következő kóddal:
from keras.datasets import cifar10# loading the dataset (X_train, y_train), (X_test, y_test) = cifar10.load_data()
Íme, így építhetsz egy tisztességes (78-80% körüli validációs pontosságú) CNN modellt a CIFAR-10-re. Figyeljük meg, hogy az alakértékek a képek méretének megfelelően (28, 28, 1) és (32, 32, 3) között frissültek:
Itt van, mit változtattam a modellben:
- Növelte a Conv2D rétegek számát, hogy mélyebb modellt építsen
- Növelte a szűrők számát, hogy több jellemzőt tanuljon
- Hozzáadta a Dropoutot a regularizációhoz
- Hozzáadott több Dense réteget
Tréning és validációs pontosság az epochák között:
Ezt a teljesítményt a fenti modell tuningolásával könnyen túlszárnyalhatja. Ha már elsajátítottad a CIFAR-10-et, a Kerasban elérhető a CIFAR-100 is, amelyet további gyakorlásra használhatsz. Mivel ez 100 osztályt tartalmaz, nem lesz könnyű feladat elérni!
Az ImageNet képeinek kategorizálása CNN-ek segítségével
Most, hogy már elsajátítottad az MNIST-et és a CIFAR-10-et, vegyük ezt a problémát egy szinttel feljebb. Itt a híres ImageNet adathalmazt vesszük szemügyre.
Az ImageNet a fő adatbázis az ImageNet Large Scale Recognition Challenge (ILSVRC) mögött. Ez olyan, mint a számítógépes látás olimpiája. Ez az a verseny, amely először tette népszerűvé a CNN-eket, és minden évben az iparágak és a tudományos élet legjobb kutatócsoportjai versenyeznek legjobb algoritmusaikkal számítógépes látási feladatokon.
Az ImageNet-adatbázisról
Az ImageNet-adatbázis több mint 14 millió képet tartalmaz, 20 000 kategóriában kézzel címkézve.
Az általunk már tárgyalt MNIST és CIFAR-10 adathalmazokkal ellentétben az ImageNet képei tisztességes felbontásúak (224 x 224), és ez az, ami kihívást jelent számunkra: 14 millió kép, mindegyik 224 x 224 pixeles. Egy ekkora méretű adathalmaz feldolgozása nagy számítási teljesítményt igényel a CPU, a GPU és a RAM tekintetében.
A hátránya – ez túl sok lehet egy hétköznapi laptop számára. Mi tehát az alternatív megoldás? Hogyan dolgozhat egy rajongó az ImageNet-adatkészlettel?
Ez az, ahol a Fast.ai Imagenette-adatkészlete jön a képbe
Az Imagenette egy olyan adatkészlet, amely a nagy ImageNet-képgyűjteményből lett kivonva. Az Imagenette kiadása mögött az áll, hogy a kutatók és a diákok az ImageNet szintű képeken gyakorolhassanak anélkül, hogy olyan sok számítási erőforrásra lenne szükségük.
Maga Jeremy Howard szavaival:
“Én (vagyis Jeremy Howard) elsősorban azért készítettem az Imagenette-et, mert szerettem volna egy kis látási adathalmazt, amivel gyorsan megnézhetem, hogy az algoritmusötleteimnek van-e esélyük működni. Általában nem működnek, de az Imageneten való tesztelésük nagyon sok időbe telik, amíg ezt kiderítem, különösen azért, mert olyan algoritmusok érdekelnek, amelyek különösen jól teljesítenek a képzés végén.”
De úgy gondolom, hogy ez egy hasznos adathalmaz lehet mások számára is.”
És ezt fogjuk használni a gyakorláshoz is!
Download the Imagenette Dataset
Íme, hogyan tudod lekérni az adathalmazt (parancsok a terminálodhoz):
$ wget https://s3.amazonaws.com/fast-ai-imageclas/imagenette2.tgz$ tar -xf imagenette2.tgz
Ha letöltötted az adathalmazt, észre fogod venni, hogy két mappája van: “train” és “val”. Ezek tartalmazzák a képzési és a validálási készletet. Mindkét mappán belül külön mappák vannak az egyes osztályokhoz. Íme az osztályok leképezése:
Ezeknek az osztályoknak ugyanaz az azonosítója az eredeti ImageNet-adatkészletben. Mindegyik osztály körülbelül 1000 képet tartalmaz, így összességében ez egy kiegyensúlyozott adathalmaz.
Képek betöltése az ImageDataGenerator használatával
A Keras rendelkezik ezzel a hasznos funkcióval a nagy képek betöltésére (mint amilyenek itt is vannak) anélkül, hogy a RAM-ot kimerítenénk, ha ezt kis tételekben végezzük. Az ImageDataGenerator a fit_generatorral kombinálva ezt a funkcionalitást biztosítja:
Az ImageDataGenerator maga következtet az osztálycímkékre és az osztályok számára a mappanevekből.
Egy alapvető CNN modell építése képosztályozáshoz
Építsünk egy alapvető CNN modellt az Imagenette adatkészletünkhöz (képosztályozás céljából):
Ha összehasonlítjuk a fenti modell validálási pontosságát, akkor láthatjuk, hogy annak ellenére, hogy ez egy mélyebb architektúra, mint amit eddig használtunk, csak 40-50% körüli validálási pontosságot tudunk elérni.
Ennek számos oka lehet, például a modellünk nem elég összetett ahhoz, hogy megtanulja a képek mögöttes mintáit, vagy esetleg a képzési adatok túl kicsik ahhoz, hogy pontosan általánosíthassunk az osztályok között.
Lépés feljebb – transzfer tanulás.
A transzfer tanulás (VGG16) használata a pontosság javítására
A VGG16 egy CNN architektúra, amely a 2014-es ImageNet Challenge első helyezettje volt. Az oxfordi Visual Graphics Group tervezte, és összesen 16 rétegből áll, magukból 13 konvolúciós rétegből. Ennek a modellnek az előre betanított súlyait fogjuk betölteni, hogy a feladatunkhoz felhasználhassuk azokat a hasznos jellemzőket, amelyeket ez a modell megtanult.
VGG16 súlyainak letöltése
from keras.applications import VGG16# include top should be False to remove the softmax layerpretrained_model = VGG16(include_top=False, weights='imagenet')pretrained_model.summary()
Jellemzők generálása a VGG16-ból
Vonjuk ki a VGG16 által már ismert hasznos jellemzőket az adatállományunk képeiből:
from keras.utils import to_categorical# extract train and val featuresvgg_features_train = pretrained_model.predict(train)vgg_features_val = pretrained_model.predict(val)
# OHE target columntrain_target = to_categorical(train.labels)val_target = to_categorical(val.labels)
Nézzük meg, milyen gyorsan kezd konvergálni a modellünk. Mindössze 10 epocha alatt 94% feletti validálási pontosságot érsz el. Hát nem elképesztő?
Ha már elsajátította az Imagenette adatkészletet, a fastai két olyan változatot is kiadott, amelyek olyan osztályokat tartalmaznak, amelyeket nehezen fog osztályozni:
- Imagewoof: Kutyafajták 10 osztálya, egy nehezebben osztályozható probléma
- Image网 (“wang”): Az Imagenette és az Imagewoof kombinációja és néhány trükk, ami nehezebbé teszi a problémát
Hova tovább?
A fenti adatkészleteken kívül az alábbi adatkészleteket is használhatjuk számítógépes látási algoritmusok építéséhez. Valójában tekintse ezt kihívásnak. Tudja-e alkalmazni a CNN-tudását, hogy megverje a benchmark pontszámot ezeken az adatkészleteken?
- Fashion MNIST – MNIST-szerű adatkészlet ruhákról és ruházati cikkekről. A képek számjegyek helyett a ruházat típusát mutatják (póló, nadrág, táska stb.)
- Caltech 101 – Egy másik kihívást jelentő adathalmaz, amelyet képosztályozáshoz találtam
Azt is javaslom, hogy mielőtt a transzfer tanulásba kezdenél, próbáld meg az alap CNN modelljeidet javítani. Tanulhat a VGG16, a ZFNet stb. architektúráiból a hiperparaméterek hangolásához, és használhatja ugyanazt az ImageDataGenerator-t a képek bővítéséhez és az adathalmaz méretének növeléséhez.
Ezt a cikket a Mobil APP-on is elolvashatja .