Taula de continguts[Amaga][Espectacle]
El cervell és comparable a les xarxes neuronals. Aquesta és l'analogia que s'utilitza normalment per ajudar algú nou en el tema a comprendre les idees darrere de l'aprenentatge automàtic i les xarxes neuronals artificials.
Com que hi ha diverses capes de càlculs matemàtics i estadístics entre bastidors, definir aquestes xarxes com a funció matemàtica és un mètode més avançat.
Això és per a les persones que realment estan interessades en l'aprenentatge automàtic i volen veure com s'escriu el codi de xarxa neuronal de Python.
En aquest article, demostrarem com construir una xarxa neuronal profunda (DNN) completament connectada des de zero. Pitó 3.
Una visió general de l'estructura de fitxers per al nostre codi de xarxa neuronal Python
Aquí es crearan tres fitxers. El primer és el fitxer nn.py senzill, que es tractarà a "Configuració de les funcions d'ajuda" i "Crear la xarxa neuronal des de zero".
També tindrem un fitxer anomenat mnist loader.py per carregar les dades de prova, tal com es descriu a "Càrrega de dades MNIST".
Finalment, tindrem un fitxer anomenat test.py que es llançarà al terminal per provar la nostra xarxa neuronal.
Aquest fitxer es descriu amb detall a "Execució de proves".
instal·lació
S'ha de baixar la biblioteca NumPy Python per seguir aquest tutorial. Podeu fer-ho mitjançant l'ordre següent al terminal:
Importació de mòduls i configuració de la funció Helper
Les dues úniques biblioteques que necessitem són aleatòries i NumPy, que importarem de seguida. Per als pesos inicials de la nostra xarxa neuronal, els barrejarem mitjançant la biblioteca aleatòria.
Per tal d'accelerar els nostres càlculs, utilitzarem NumPy o np (per convenció, sovint s'importa com a np). Les nostres dues funcions d'ajuda es faran després de les nostres importacions. Dues funcions sigmoides: una i sigmoide primer.
La regressió logística classificarà les dades mitjançant la funció sigmoide, mentre que la retropropagació calcularà el delta o el gradient mitjançant la funció principal sigmoide.
Creació de classes de xarxa
La construcció d'una xarxa neuronal totalment vinculada és l'únic objectiu d'aquesta secció. La classe de xarxa inclourà totes les funcions següents. La funció Object() { [codi natiu] } es crearà inicialment a la nostra classe de xarxa.
La funció Object() { [codi natiu] } requereix un argument, mides. La variable de mides és una col·lecció de valors numèrics que representa el nombre de nodes d'entrada presents a cada capa de la nostra xarxa neuronal.
Iniciem quatre propietats en el nostre mètode __init__. Les variables d'entrada, mides, s'utilitzen per establir la llista de mides de capes i el nombre de capes, num capes, respectivament.
El primer pas és assignar aleatòriament els biaixos inicials de la nostra xarxa a cada capa que segueix la capa d'entrada.
Finalment, cada enllaç entre les capes d'entrada i sortida té els seus pesos generats aleatòriament. Np.Random.Randn() dóna una mostra aleatòria extreta de la distribució normal per al context.
Funció Feed Forward
En una xarxa neuronal, la informació s'envia cap endavant mitjançant la funció de feedforward. Aquesta funció requerirà un argument, a, que indica el vector d'activació actual.
Aquesta funció estima les activacions a cada capa iterant tots els biaixos i pesos de la xarxa. La resposta donada és la predicció, que són les activacions de l'última capa.
Descens de gradient mini-lot
El cavall de batalla de la nostra classe de xarxa és Gradient Descent. En aquesta versió, utilitzem el descens del gradient mini-batch (estocàstic), una variació modificada del descens del gradient.
Això indica que s'utilitzarà un petit lot de punts de dades per actualitzar el nostre model. Es passen quatre arguments obligatoris i un opcional a aquest mètode. Les quatre variables necessàries són el conjunt de dades d'entrenament, el nombre d'èpoques, la mida dels mini-lots i la taxa d'aprenentatge (eta).
Les dades de la prova estan disponibles a petició. Proporcionarem dades de prova quan avaluem aquesta xarxa. El nombre de mostres d'aquesta funció s'estableix inicialment a la longitud de la llista un cop les dades d'entrenament s'han transformat en un tipus de llista.
També apliquem el mateix procés a les dades de prova que es donen. Això és perquè en lloc de tornar-nos com a llistes, són realment comprimits de llistes. Quan carreguem les mostres de dades MNIST més tard, aprendrem més sobre això.
Si ens podem assegurar que proporcionem els dos tipus de dades com a llistes, aleshores aquest tipus de càsting no és necessàriament essencial.
Un cop tenim les dades, repassem les èpoques d'entrenament en bucle. Un període d'entrenament és només una ronda d'entrenament en xarxes neuronals. Primer barregem les dades a cada època per garantir l'atzar abans de fer una llista de mini-lots.
La funció d'actualització del mini lot, que s'explica a continuació, s'anomenarà per a cada mini lot. La precisió de la prova també es retornarà si les dades de la prova estan disponibles.
Funció d'ajuda derivada del cost
Desenvolupem una funció d'ajuda anomenada derivada de costos abans de crear realment el codi de retropropagació. Si ens equivoquem a la nostra capa de sortida, la funció de derivada de costos ho mostrarà.
Requereix dues entrades: la matriu d'activacions de sortida i les coordenades y dels valors de sortida anticipats.
Funció de retropropagació
Cal tenir en compte el nostre vector d'activació actual, activació, així com qualsevol altre vector d'activació, activacions i vectors z, zs. Primer s'activa una capa anomenada capa d'entrada.
Repassarem cada biaix i pes després de col·locar-los. Cada bucle implica calcular el vector z com el producte escalat dels pesos i l'activació, afegir-lo a la llista de zs, recalcular l'activació i afegir l'activació actualitzada a la llista d'activacions.
Finalment, les matemàtiques. El delta, que és igual a l'error de la capa anterior multiplicat pel primer sigmoide de l'últim element dels vectors zs, es calcula abans de començar el nostre pas cap enrere.
L'última capa de nabla b està configurada per ser el delta, i la capa final de nabla w està configurada per ser el producte escalat del delta i la penúltima capa d'activacions (transposada perquè puguem fer les matemàtiques) .
Procedim com abans, començant per la segona capa i acabant amb l'última, i repetim el procés després de completar aquestes últimes capes. A continuació, les nables es tornen com una tupla.
S'està actualitzant el descens del gradient del mini-lot
El nostre mètode SGD (descens de gradient estocàstic) d'abans incorpora l'actualització de mini-lots. Com que s'utilitza a SGD, però també requereix backprop, vaig debatre on posar aquesta funció.
Finalment, vaig decidir publicar-lo aquí. Comença generant 0 vectors de nablas de biaixos i pesos, tal com ho va fer la nostra funció de backprop.
Requereix el mini-lot i la taxa d'aprenentatge eta com les seves dues entrades. Al mini-lot, fem servir la funció backprop per obtenir el delta de cada matriu nabla per a cada entrada, x, i sortida, y. Les llistes de nabla s'actualitzen després amb aquests deltes.
Finalment, fem servir la taxa d'aprenentatge i les nables per actualitzar els pesos i biaixos de la xarxa. Cada valor s'actualitza al valor més recent, menys la taxa d'aprenentatge, multiplicat per la mida del minilot i, després, s'afegeix al valor nabla.
Avaluar la funció
La funció d'avaluació és l'última que hem d'escriure. Les dades de prova són l'única entrada per a aquesta funció. En aquesta funció, només comparem les sortides de la xarxa amb el resultat previst, y. Alimentant l'entrada, x, endavant, es determinen les sortides de la xarxa.
Codi complet
Quan combinem tot el codi, així apareix.
Prova de la xarxa neuronal
S'estan carregant dades MNIST
El Dades del MNIST està en format .pkl.gz, que obrirem amb GZIP i carregarem amb pickle. Escrivim un mètode ràpid per carregar aquestes dades com una tupla de mida tres, dividida en dades d'entrenament, validació i prova.
Per facilitar la gestió de les nostres dades, escriurem una altra funció per codificar la y en una matriu de 10 elements. La matriu serà tots 0 excepte un 1 que coincideix amb el dígit adequat de la imatge.
Utilitzarem les dades de càrrega bàsiques i un mètode de codificació en calent per carregar les nostres dades en un format llegible. S'escriurà una altra funció que convertirà els nostres valors x en una llista de mida 784, coincidint amb els 784 píxels de la imatge, i els nostres valors y en la seva forma de vector codificat en calent.
A continuació, combinarem els valors x i y de manera que un índex coincideixi amb l'altre. Això s'aplica als conjunts de dades d'entrenament, validació i prova. A continuació, retornem les dades modificades.
Execució de proves
Farem un fitxer nou anomenat "carregador mnist" que importarà tant la xarxa neuronal que vam establir anteriorment (nn simple) com el carregador del conjunt de dades MNIST abans de començar la prova.
En aquest fitxer, tot el que hem de fer és importar les dades, crear una xarxa amb una mida de capa d'entrada de 784 i una mida de capa de sortida de 10, executar la funció SGD de la xarxa a les dades d'entrenament i després provar-la amb les dades de prova.
Tingueu en compte que per a la nostra llista de capes d'entrada, no hi ha cap diferència quins són els números entre 784 i 10. Podem canviar les altres capes de la manera que vulguem; només es fixen les mides d'entrada i sortida.
No calen tres capes; podríem utilitzar quatre, cinc o fins i tot només dos. Diverteix-te experimentant-hi.
Conclusió
Aquí, utilitzant Python 3, creem una xarxa neuronal des de zero. Juntament amb les matemàtiques d'alt nivell, també vam discutir les especificitats de la implementació.
Vam començar implementant funcions d'ajuda. Perquè les neurones funcionin, les funcions primer sigmoide i sigmoide són crucials. A continuació, posem en pràctica la funció de feedforward, que és el procés fonamental per alimentar dades a la xarxa neuronal.
A continuació, vam crear la funció de descens de gradient a Python, el motor que impulsa la nostra xarxa neuronal. Per tal de localitzar els "mínims locals" i optimitzar els seus pesos i biaixos, la nostra xarxa neuronal utilitza el descens de gradients. Hem creat la funció de retropropagació utilitzant descens en gradient.
En oferir actualitzacions quan les sortides no coincideixen amb les etiquetes adequades, aquesta funció permet que la xarxa neuronal "aprèn".
Finalment, posem el nostre nou Python xarxa neural a la prova utilitzant el conjunt de dades MNIST. Tot va funcionar sense problemes.
Codificació feliç!
Deixa un comentari