Tartalomjegyzék[Elrejt][Előadás]
Az agy a neurális hálózatokhoz hasonlítható. Ez az a hasonlat, amelyet általában arra használnak, hogy a témában újoncokat segítsenek megérteni a gépi tanulás és a mesterséges neurális hálózatok mögött rejlő gondolatokat.
Mivel a színfalak mögött a matematikai és statisztikai számítások több rétege zajlik, e hálózatok matematikai függvényként való meghatározása fejlettebb módszer.
Ez azoknak szól, akik valóban érdeklődnek a gépi tanulás iránt, és szeretnék látni, hogyan írják a Python neurális hálózati kódját.
Ebben a cikkben bemutatjuk, hogyan lehet teljesen összekapcsolt mély neurális hálózatot (DNN) létrehozni a semmiből. Piton 3.
A Python neurális hálózati kódunk fájlszerkezetének áttekintése
Itt három fájl jön létre. Az első az egyszerű nn.py fájl, amelyről a „Segítő funkciók beállítása” és a „Neurális hálózat felépítése a semmiből” című részben lesz szó.
A tesztadatok betöltéséhez egy mnist loader.py nevű fájlunk is lesz, az „MNIST adatok betöltése” részben leírtak szerint.
Végül lesz egy test.py nevű fájlunk, amely elindul a terminálban, hogy tesztelje a neurális hálózatunkat.
Ennek a fájlnak a leírása a „Tesztek futtatása” részben található.
Telepítés
Az oktatóanyag követéséhez le kell tölteni a NumPy Python könyvtárat. Ezt a következő parancs használatával érheti el a terminálon:
Modulok importálása és a Helper funkció beállítása
Az egyetlen két könyvtár, amire szükségünk van, a véletlenszerű és a NumPy, amelyeket azonnal importálunk. Neurális hálózatunk kezdeti súlyaihoz a véletlenszerű könyvtár segítségével keverjük össze őket.
A számítások felgyorsítása érdekében a NumPy-t vagy az np-t fogjuk használni (melyet a megállapodás szerint gyakran np-ként importálnak). Két segítő funkciónk importjaink után készül el. Két szigmafüggvény: az egyik és a szigmoid prím.
A logisztikai regresszió a szigmoid függvény segítségével osztályozza az adatokat, míg a visszaterjesztés a delta vagy a gradienst a szigmoid prímfüggvény segítségével számítja ki.
Hálózati osztály létrehozása
Ebben a részben egy teljesen összekapcsolt neurális hálózat felépítése áll az egyetlen fókuszban. A hálózati osztály magában foglalja az összes ezután következő funkciót. Az Object() { [natív kód] } függvény először létrejön a hálózati osztályunkban.
Az Object() { [natív kód] } függvénynek egy argumentumra, a méretekre van szükség. A méretváltozó numerikus értékek gyűjteménye, amely a neurális hálózatunk egyes rétegeiben található bemeneti csomópontok számát jelenti.
Az __init__ metódusunkban négy tulajdonságot inicializálunk. A bemeneti változók, méretek, a fóliaméretek listájának és a fóliák számának, a rétegek számának beállítására szolgálnak.
Az első lépés az, hogy véletlenszerűen hozzárendeljük hálózatunk kezdeti torzításait minden egyes réteghez, amely a bemeneti réteget követi.
Végül a bemeneti és kimeneti rétegek közötti minden kapcsolatnak véletlenszerűen generált súlya van. Az Np.Random.Randn() a kontextus normál eloszlásából vett véletlenszerű mintát ad.
Előtolás funkció
Egy neurális hálózatban az információt az előrecsatolási függvény továbbítja. Ennek a függvénynek egy argumentuma, az a, amely az aktuális aktiválási vektort jelzi.
Ez a függvény a hálózat összes torzításán és súlyozásán át iterálva megbecsüli az aktiválásokat az egyes rétegekben. A válasz az előrejelzés, ami az utolsó réteg aktiválása.
Mini-batch Gradient Descent
Hálózati osztályunk igáslója a Gradient Descent. Ebben a verzióban mini kötegelt (sztochasztikus) gradiens süllyedést használunk, a gradiens süllyedés egy módosított változatát.
Ez azt jelzi, hogy a modellünk frissítéséhez egy kis mennyiségű adatpont kerül felhasználásra. Négy kötelező és egy opcionális argumentum kerül átadásra ennek a metódusnak. A négy szükséges változó a betanítási adatkészlet, az epochák száma, a mini-kötegek mérete és a tanulási sebesség (eta).
A vizsgálati adatok kérésre rendelkezésre állnak. Tesztadatokat fogunk szolgáltatni, amikor végül értékeljük ezt a hálózatot. Ebben a funkcióban a minták száma kezdetben a lista hosszára lesz beállítva, miután a betanítási adatokat listatípussá alakították.
Ugyanezt a folyamatot alkalmazzuk a megadott adatok tesztelésére is. Ez azért van, mert ahelyett, hogy listákként adnák vissza őket, valójában listák tömörítményei. Amikor később betöltjük az MNIST adatmintákat, többet megtudunk erről.
Ha meg tudjuk győződni arról, hogy mindkét típusú adatot listaként adjuk meg, akkor ez a típus-öntés nem feltétlenül szükséges.
Ha megvannak az adatok, körben végigmegyünk a képzési korszakokon. A képzési időszak csak egy köre a neurális hálózat képzésének. Minden korszakban először megkeverjük az adatokat, hogy biztosítsuk a véletlenszerűséget, mielőtt listát készítenénk a mini kötegekről.
Az alábbiakban tárgyalt frissítési mini köteg funkciót minden mini köteghez meghívjuk. A teszt pontosságát is visszaküldjük, ha a tesztadatok rendelkezésre állnak.
Költség-derivatív segítő funkció
Mielőtt valóban létrehoznánk a visszaterjesztési kódot, dolgozzunk ki egy segédfüggvényt, melynek neve költségderivatív. Ha hibát követünk el a kimeneti rétegünkben, a költségderivatív függvény megmutatja.
Két bemenetre van szükség: a kimeneti aktiválási tömbre és a várt kimeneti értékek y-koordinátáira.
Visszaterjesztés funkció
A jelenlegi aktivációs vektorunkat, az aktiválást, valamint minden más aktivációs vektort, aktiválást és z-vektort, a zs-t, szem előtt kell tartani. Először a bemeneti rétegnek nevezett réteg aktiválódik.
Felhelyezésük után végignézzük az egyes torzításokat és súlyokat. Minden ciklusban ki kell számítani a z vektort a súlyok és az aktiválás pontszorzataként, hozzáadni a zs-listához, újraszámolni az aktiválást, és hozzáadni a frissített aktiválást az aktiválások listájához.
Végül a matematika. A delta, amely megegyezik az előző réteg hibájának szorzatával a zs vektorok utolsó elemének szigmoid prímjével, a visszafelé lépés megkezdése előtt számítódik ki.
A nabla b utolsó rétege a delta, a nabla w utolsó rétege pedig a delta és az aktiválások második rétegének pontszorzata (transzponálva, hogy ténylegesen meg tudjuk számolni) .
Folytatjuk a korábbiak szerint, kezdve a második réteggel, és az utolsó réteggel befejezve, és az utolsó rétegek befejezése után megismételjük a folyamatot. Ezután a nablákat egy sorként adják vissza.
Mini-batch gradiens süllyedés frissítése
Korábbi SGD (stochastic gradient descent) módszerünk magában foglalja a mini-batch frissítést. Mivel SGD-ben használják, de backprop is kell, ezért azon tanakodtam, hogy hova tegyem ezt a funkciót.
Végül úgy döntöttem, hogy felteszem ide. Úgy kezdődik, hogy 0 vektort generál a torzítások és súlyok nablaiból, akárcsak a backprop függvényünk.
Két bemenete a mini-batch és az eta tanulási sebesség. A mini kötegben ezután a backprop függvényt használjuk, hogy megkapjuk az egyes nabla tömbök deltáját minden bemenethez (x) és kimenethez (y). A nabla listák ezután ezekkel a deltákkal frissülnek.
Végül a tanulási sebességet és a nablast használjuk a hálózat súlyainak és torzításainak frissítésére. Minden érték frissül a legújabb értékre, levonva a tanulási sebességet, megszorozva a minibatch méretével, majd hozzáadódik a nabla értékhez.
Funkció értékelése
Az értékelő függvény az utolsó, amit meg kell írnunk. A tesztadatok az egyetlen bemenet ehhez a funkcióhoz. Ebben a függvényben csak a hálózat kimeneteit hasonlítjuk össze a várt eredménnyel, y. Az x bemenet előre betáplálásával meghatározzuk a hálózat kimeneteit.
Teljes kód
Ha az összes kódot egyesítjük, ez így jelenik meg.
Neurális hálózat tesztelése
MNIST adatok betöltése
A MNIST adatok .pkl.gz formátumban van, amelyet GZIP-pel nyitunk meg, és betöltünk savanyúsággal. Írjunk egy gyors módszert az adatok betöltésére három méretű sorként, amely képzési, érvényesítési és tesztadatokra van osztva.
Az adatok könnyebb kezelésének érdekében írunk egy másik függvényt, amely az y-t 10 elemes tömbbe kódolja. A tömb 0 lesz, kivéve egy 1-et, amely megfelel a kép megfelelő számjegyének.
Az alapvető betöltési adatokat és egy hot encode módszert használjuk adataink olvasható formátumba való betöltéséhez. Egy másik függvény lesz írva, amely az x értékeinket egy 784-es méretű listává alakítja, amely illeszkedik a kép 784 pixeléhez, az y értékeinket pedig egyetlen hot-encoded vektoros formájukba.
Ezután összevonjuk az x és y értékeket úgy, hogy az egyik index megegyezzen a másikkal. Ez vonatkozik a betanítási, érvényesítési és tesztadatkészletekre. Ezután visszaküldjük a megváltozott adatokat.
Futó tesztek
Készítünk egy új fájlt „mnist loader” néven, amely importálja mind a korábban létrehozott neurális hálózatot (egyszerű nn), mind az MNIST adatkészlet-betöltőt a tesztelés megkezdése előtt.
Ebben a fájlban nem kell mást tennünk, mint importálni az adatokat, felépíteni egy hálózatot 784-es bemeneti réteggel és 10-es kimeneti réteggel, futtatni a hálózat SGD funkcióját a betanítási adatokon, majd tesztelni a tesztadatok segítségével.
Ne feledje, hogy a bemeneti fóliák listáján nem számít, hogy a 784 és 10 közötti számok közül milyen számok vannak. A többi réteget tetszés szerint módosíthatjuk; csak a bemeneti és kimeneti méretek rögzítettek.
Három réteg nem szükséges; használhatunk négyet, ötöt vagy akár csak kettőt. Jó szórakozást a kísérletezéshez.
Következtetés
Itt a Python 3 segítségével létrehozunk egy neurális hálózatot a semmiből. A magas szintű matematika mellett a megvalósítás sajátosságait is megbeszéltük.
A segítő funkciók megvalósításával kezdtük. A neuronok működéséhez a szigma és a szigma elsődleges funkciói döntőek. Ezután gyakorlatba ültetjük a visszacsatolási funkciót, amely az adatok neurális hálózatba történő betáplálásának alapvető folyamata.
Ezután létrehoztuk a gradiens süllyedés függvényt a Pythonban, a neurális hálózatunkat vezérlő motorban. A „helyi minimumok” megtalálása és súlyuk és torzításuk optimalizálása érdekében neurális hálózatunk gradiens süllyedést használ. A backpropagation függvényt a segítségével hoztuk létre gradiens süllyedés.
Azáltal, hogy frissítéseket küld, amikor a kimenetek nem egyeznek a megfelelő címkékkel, ez a funkció lehetővé teszi a neurális hálózat számára, hogy „tanuljon”.
Végül behelyeztük vadonatúj Pythonunkat neurális hálózat a teszthez az MNIST adatkészlet segítségével. Minden gördülékenyen működött.
Boldog kódolás!
Hagy egy Válaszol