Saturs[Paslēpt][Rādīt]
Smadzenes ir salīdzināmas ar neironu tīkliem. Šī ir analoģija, ko parasti izmanto, lai palīdzētu kādam jaunam priekšmetam izprast mašīnmācības un mākslīgo neironu tīklu idejas.
Tā kā aizkulisēs notiek vairāki matemātisko un statistisko aprēķinu slāņi, šo tīklu definēšana kā matemātiska funkcija ir progresīvāka metode.
Tas ir paredzēts cilvēkiem, kuri patiešām interesējas par mašīnmācību un vēlas redzēt, kā tiek rakstīts Python neironu tīkla kods.
Šajā rakstā mēs parādīsim, kā no jauna izveidot pilnībā savienotu dziļo neironu tīklu (DNN). Pitons 3.
Pārskats par mūsu Python neironu tīkla koda faila struktūru
Šeit tiks izveidoti trīs faili. Pirmais ir vienkāršais fails nn.py, kas tiks apspriests sadaļās “Palīdzības funkciju iestatīšana” un “Neironu tīkla izveide no nulles”.
Mums būs arī fails ar nosaukumu mnist loader.py, lai ielādētu testa datus, kā aprakstīts sadaļā “MNIST datu ielāde”.
Visbeidzot, mums būs fails ar nosaukumu test.py, kas tiks palaists terminālī, lai pārbaudītu mūsu neironu tīklu.
Šis fails ir detalizēti aprakstīts sadaļā “Pārbaudes”.
uzstādīšana
Lai sekotu šai apmācībai, ir jālejupielādē NumPy Python bibliotēka. To var paveikt, terminālī izmantojot šādu komandu:
Moduļu importēšana un palīdzības funkcijas iestatīšana
Vienīgās divas mums nepieciešamas bibliotēkas ir izlases un NumPy, kuras mēs tūlīt importēsim. Neironu tīkla sākotnējām vērtībām mēs tos sajaucam, izmantojot izlases bibliotēku.
Lai paātrinātu aprēķinus, mēs izmantosim NumPy vai np (pēc vienošanās tas bieži tiek importēts kā np). Mūsu divas palīgfunkcijas tiks veiktas pēc mūsu importa. Divas sigmoīdas funkcijas: viena un sigmoidā primārā.
Loģistiskā regresija klasificēs datus, izmantojot sigmoidālo funkciju, savukārt atpakaļpavairošana aprēķinās delta vai gradientu, izmantojot sigmoidālo funkciju.
Tīkla klases izveide
Pilnībā saistīta neironu tīkla izveide ir vienīgais šīs sadaļas fokuss. Tīkla klase ietvers visas turpmākās funkcijas. Funkcija Object() { [vietējais kods] } sākotnēji tiks izveidota mūsu tīkla klasē.
Viens arguments, izmēri, ir nepieciešams funkcijai Object() { [vietējais kods]}. Izmēru mainīgais ir skaitlisko vērtību kolekcija, kas atspoguļo katrā mūsu neironu tīkla slānī esošo ievades mezglu skaitu.
Mēs inicializējam četrus rekvizītus mūsu __init__ metodē. Ievades mainīgie lielumi tiek izmantoti, lai iestatītu attiecīgi slāņu izmēru sarakstu un slāņu skaitu, slāņu skaitu.
Pirmais solis ir nejauši piešķirt mūsu tīkla sākotnējos novirzes katram slānim, kas seko ievades slānim.
Visbeidzot, katrai saitei starp ievades un izvades slāņiem ir nejauši ģenerēti svari. Np.Random.Randn() sniedz nejaušu paraugu, kas ņemts no konteksta normālā sadalījuma.
Padeves pārsūtīšanas funkcija
Neironu tīklā informācija tiek nosūtīta uz priekšu, izmantojot pārsūtīšanas funkciju. Šai funkcijai būs nepieciešams viens arguments a, kas norāda pašreizējo aktivizācijas vektoru.
Šī funkcija novērtē aktivizāciju katrā slānī, atkārtojot visus tīkla novirzes un svarus. Sniegtā atbilde ir prognoze, kas ir pēdējā slāņa aktivizēšana.
Mini-partijas gradienta nolaišanās
Mūsu tīkla klases darba zirgs ir Gradient Descent. Šajā versijā mēs izmantojam mini-partijas (stohastisko) gradienta nolaišanos, kas ir modificēts gradienta nolaišanās variants.
Tas norāda, ka mūsu modeļa atjaunināšanai tiks izmantota neliela datu punktu grupa. Šai metodei tiek nodoti četri obligātie un viens neobligāts arguments. Četri nepieciešamie mainīgie ir apmācības datu kopa, laikmetu skaits, mini partiju lielums un mācīšanās ātrums (eta).
Pārbaudes dati ir pieejami pēc pieprasījuma. Mēs sniegsim testa datus, kad beidzot novērtēsim šo tīklu. Paraugu skaits šajā funkcijā sākotnēji tiek iestatīts uz saraksta garumu, kad apmācības dati ir pārveidoti saraksta veidā.
Mēs arī izmantojam to pašu procesu, lai pārbaudītu ievadītos datus. Tas ir tāpēc, ka tā vietā, lai tos atgrieztu mums kā sarakstus, tie patiešām ir sarakstu zip. Kad vēlāk ielādēsim MNIST datu paraugus, mēs par to uzzināsim vairāk.
Ja mēs varam nodrošināt, ka abu veidu datus sniedzam kā sarakstus, tad šāda veida atlase nav obligāti nepieciešama.
Kad ir iegūti dati, mēs cikliski pārskatām apmācības laikmetus. Apmācības periods ir tikai viena neironu tīkla apmācības kārta. Mēs vispirms sajaucam datus katrā laikmetā, lai nodrošinātu nejaušību, pirms izveidojam minipakešu sarakstu.
Atjaunināšanas mini pakešu funkcija, kas ir aplūkota turpmāk, tiks izsaukta katrai mini partijai. Testa precizitāte tiks atgriezta arī tad, ja būs pieejami testa dati.
Izmaksu atvasinātā palīga funkcija
Vispirms izstrādāsim palīgfunkciju, ko sauc par izmaksu atvasinājumu, pirms patiešām izveidosim atpakaļpavairošanas kodu. Ja mēs pieļaujam kļūdu mūsu izvades slānī, izmaksu atvasinājuma funkcija to parādīs.
Tam nepieciešamas divas ievades: izvades aktivizācijas masīvs un paredzamo izvades vērtību y-koordinātas.
Backpropagation funkcija
Mūsu pašreizējais aktivizācijas vektors, aktivizēšana, kā arī visi citi aktivizācijas vektori, aktivācijas un z-vektori, zs, ir jāpatur prātā. Vispirms tiek aktivizēts slānis, ko sauc par ievades slāni.
Mēs apskatīsim katru novirzi un svaru pēc to ievietošanas. Katra cilpa ietver z vektora aprēķināšanu kā svaru un aktivizācijas punktu reizinājumu, pievienošanu zs sarakstam, aktivizēšanas pārrēķinu un atjauninātās aktivizācijas pievienošanu aktivizāciju sarakstam.
Visbeidzot, matemātika. Delta, kas ir vienāda ar iepriekšējā slāņa kļūdu, kas reizināta ar zs vektoru pēdējā elementa sigmoidālo pirmskaitļu, tiek aprēķināta, pirms mēs sākam atpakaļejošu pāreju.
Pēdējais nabla b slānis ir iestatīts kā delta, un pēdējais nabla w slānis ir iestatīts kā delta un otrā līdz pēdējam aktivizācijas slāņa punktveida reizinājums (transponēts, lai mēs varētu faktiski veikt matemātiku). .
Mēs rīkojamies tāpat kā iepriekš, sākot ar otro slāni un beidzot ar pēdējo, un atkārtojam procesu pēc šo pēdējo slāņu pabeigšanas. Pēc tam nablas tiek atdotas kā tuple.
Notiek mini-partijas gradienta nolaišanās atjaunināšana
Mūsu iepriekš izmantotā SGD (stohastiskā gradienta nolaišanās) metode ietver mini-pakešu atjaunināšanu. Tā kā tas tiek izmantots SGD, bet tam ir nepieciešams arī backprop, es debatēju, kur ievietot šo funkciju.
Beidzot es izdarīju izvēli publicēt to šeit. Tas sākas, ģenerējot 0 novirzes un svaru nablas, tāpat kā to darīja mūsu backprop funkcija.
Tam kā divas ievades ir nepieciešama mini-partija un eta mācīšanās ātrums. Mini-partijā mēs izmantojam backprop funkciju, lai iegūtu katra nabla masīva delta katrai ievadei x un izvadei y. Pēc tam nabla saraksti tiek atjaunināti ar šīm deltām.
Visbeidzot, mēs izmantojam mācīšanās ātrumu un nablas, lai atjauninātu tīkla svarus un novirzes. Katra vērtība tiek atjaunināta uz jaunāko vērtību, atskaitot mācīšanās ātrumu, kas reizināta ar minipartijas lielumu, un pēc tam tiek pievienota nabla vērtībai.
Novērtējiet funkciju
Novērtēšanas funkcija ir pēdējā, kas mums jāieraksta. Pārbaudes dati ir vienīgā šīs funkcijas ievade. Šajā funkcijā mēs salīdzinām tikai tīkla izejas ar paredzamo rezultātu, y. Padodot ievadi, x, uz priekšu, tiek noteiktas tīkla izejas.
Pilnīgs kods
Apvienojot visu kodu, tas parādās šādi.
Neironu tīkla pārbaude
Notiek MNIST datu ielāde
Jūsu darbs IR Klientu apkalpošana MNIST dati ir .pkl.gz formātā, kuru mēs atvērsim, izmantojot GZIP, un ielādēsim ar marinējumu. Uzrakstīsim ātru metodi, kā ielādēt šos datus kā trīs lieluma kopu, kas sadalīta apmācības, validācijas un pārbaudes datos.
Lai mūsu dati būtu vieglāk pārvaldāmi, mēs ierakstīsim citu funkciju, lai kodētu y 10 vienumu masīvā. Masīvā būs visas 0, izņemot 1, kas atbilst attēla pareizajam ciparam.
Mēs izmantosim pamata ielādes datus un vienu karstā kodēšanas metodi, lai ielādētu savus datus lasāmā formātā. Tiks uzrakstīta vēl viena funkcija, kas pārveidos mūsu x vērtības 784 izmēra sarakstā, kas atbilst attēla 784 pikseļiem, un mūsu y vērtības to vienotā karsti kodētā vektora formā.
Pēc tam mēs apvienosim x un y vērtības tā, lai viens rādītājs atbilstu otram. Tas attiecas uz apmācību, validācijas un pārbaudes datu kopām. Pēc tam mēs atgriežam mainītos datus.
Skriešanas testi
Mēs izveidosim jaunu failu ar nosaukumu “mnist loader”, kas importēs gan iepriekš izveidoto neironu tīklu (vienkāršā nn), gan MNIST datu kopas ielādētāju, pirms sāksim testēšanu.
Šajā failā viss, kas mums jādara, ir importēt datus, izveidot tīklu ar ievades slāņa izmēru 784 un izvades slāņa izmēru 10, palaist tīkla SGD funkciju uz apmācības datiem un pēc tam pārbaudīt to, izmantojot testa datus.
Ņemiet vērā, ka mūsu ievades slāņu sarakstam nav nozīmes, kāds no skaitļiem ir no 784 līdz 10. Mēs varam mainīt pārējos slāņus, kā vien vēlaties; tikai ieejas un izvades izmēri ir fiksēti.
Trīs slāņi nav nepieciešami; mēs varētu izmantot četrus, piecus vai pat tikai divus. Izklaidējieties ar to eksperimentējot.
Secinājumi
Šeit, izmantojot Python 3, mēs izveidojam neironu tīklu no nulles. Paralēli augsta līmeņa matemātikai pārrunājām arī ieviešanas specifiku.
Mēs sākām ar palīgu funkciju ieviešanu. Lai neironi darbotos, sigmoīdās un sigmoidās galvenās funkcijas ir ļoti svarīgas. Pēc tam mēs praksē ieviesām pārsūtīšanas funkciju, kas ir pamatprocess datu ievadīšanai neironu tīklā.
Tālāk mēs izveidojām gradienta nolaišanās funkciju Python, dzinējā, kas vada mūsu neironu tīklu. Lai atrastu “lokālos minimumus” un optimizētu to svarus un novirzes, mūsu neironu tīkls izmanto gradienta nolaišanos. Mēs izveidojām atpakaļpavairošanas funkciju, izmantojot gradienta nolaišanās.
Piegādājot atjauninājumus, ja izvadi neatbilst pareizajām etiķetēm, šī funkcija ļauj neironu tīklam “mācīties”.
Visbeidzot, mēs ievietojām savu pilnīgi jauno Python neironu tīklu uz testu, izmantojot MNIST datu kopu. Viss darbojās gludi.
Laimīgu kodēšanu!
Atstāj atbildi