Kôdimo neuronsku mrežu ispočetka - 1. dio

1. dio, 2. dio i 3. dio

Postoji nešto posebno zanimljivo u računalnom učenju da radi jednostavne zadatke, s danom vjerojatnošću da će jednog dana možda nadmašiti ljudske mogućnosti.

Ovaj je udžbenik namijenjen učenju kreativnih kodira kako stvoriti umjetnu neurološku mrežu (ANN). Da budemo malo precizniji, naša mreža će se sastojati od neurona i perceptrona koji će se kretati prema naprijed i koristiti leđno širenje za učenje. Možda vam zvuči tuđino, ali ne bojte se, objasnit ću sve u detalje. To je takođe ANN u svom najjednostavnijem obliku. Stoga, nemojte očekivati ​​Tensorflow izazivač, njegova ljepota leži u njegovoj jednostavnosti. Potrebno je određeno upoznavanje s objektno orijentiranim programiranjem (OOP).

Pomoću popularnog skupa podataka MNIST rukom pisanih znamenki upotrijebit ćemo za osposobljavanje mreže i konačno prepoznati svaku od njih. Možete koristiti željeni jezik, ali preporučujem obradu radi njegove jednostavne upotrebe i grafičkih mogućnosti koje će nam pomoći da shvatimo što se događa.

Kao sporednu napomenu, ako mi se dogodi da imam iskusnih čitatelja s AI, rado bih čuo mogu li se poboljšati performanse bez dodavanja previše složenosti ili knjižnica.

NMIST skup podataka - Slika Adam Geitgey

Kako funkcionira naš mozak?

Prvo istražimo odakle potječe ANN - naš mozak. Kad se vidi znak ograničenja brzine "70", fotoni koji odbijaju od vaših farova, na ploču i natrag u vašu mrežnicu proizvode kemijsku reakciju. Neki od neurona spojenih na vaš vidni korteks bi se uzbudio i proslijedio signal drugim neuronima kroz mrežu dendrita koji oslobađaju kemijski signal.

Neuronski signal @ GIF iz tvrtke DynamicScience

Naposljetku, aktivnost se pojačava u vašim okcipitalnim i temporalnim režnjevima (područja za tumačenje vizualnih podataka) i omogućuje vam da shvatite da prelazite ograničenje brzine. Fotoni se prema tome obrađuju kroz više slojeva koji vode do ispravne akcije, u ovom slučaju smanjujući vašu brzinu.

S našim elementarnim razumijevanjem moždane funkcije krenimo u istraživanje strukture NN-a koju ćemo izgraditi. Možemo apstrahirati gore spomenuti koncept konstruirajući skup neurona "Ulazi" koji predstavljaju mrežnicu, a to će imati oblik mreže piksela. Podaci se zatim prenose u "skriveni" sloj koji predstavlja slojeve u našem mozgu. Konačno, ovaj skriveni sloj povezuje se s izlaznim slojem, ekvivalentom motornim neuronima zbog kojih ste usporili.

Primijetite kako svaki neuron unutar svakog sloja nije povezan međusobno za razliku od našeg mozga. Umjesto toga, oni su povezani sa svim neuronima u sljedećem sloju. To objašnjava prirodu naše mreže za prijenos unaprijed, podaci se prosljeđuju kroz slojeve.

S obzirom na veličinu matrica u svakom sloju, one su zadržane što je moguće manje, tako da mreža može biti pokrenuta na bilo kojem prijenosnom računalu. Svaka znamenka (ulaz) predstavljena je kao mreža veličine 14x14 piksela (vidi dolje) koju je Alasdair Turner smanjio sa 28x28. Skriveni sloj sastoji se od mreže dimenzija 7x7, ovo je potpuno proizvoljan izbor i potičem vas da se igrate okolo kad sve pokrenete. I na kraju, naš izlaz je niz od 10 neurona, od kojih svaki označava moguću znamenku od 0 do 9.

Rukopis

Umjesto da u svakom sloju imamo neurone, imat ćemo i Perceptrone. Njihova je svrha uzeti zbroj ulaznih podataka, a ako je iznad određenog praga, tada će se "upaliti". Uočite kako se unosi svaki unos, oni s većim brojem (podebljana strelica) označavaju jaču vezu između neurona. U tom će slučaju 90% (0,9 * 100) signala proći.

Napišemo neki kod

S osnovama načina na koji strukturiramo naš program, možete to ponoviti u obradi tako da otvorite karticu za svaki sljedeći segment.

  1. Glavna kartica: Ovo će nam omogućiti da nacrtamo, treniramo i testiramo našu neuronsku mrežu.
  2. Podaci o učitavanju: ova će nam kartica omogućiti da spremimo skup s oznakom "flash kartice". Svaka će flash kartica na sebi imati rukom pisani broj koji će neuronska mreža prepoznati, a na poleđini oznaku koja će nam reći koji je to zapravo broj.
  3. Neuron: To će biti kôd za pojedini perceptron kao što je gore prikazano.
  4. Mreža: Sastojat će se od niza neurona. Jedan za ulazni sloj, jedan za skriveni sloj i jedan za izlazni sloj.
  5. Sigmoid: Svrha ove kartice je konstruirati funkciju "kako pucati na neurona". Više detalja o tome u drugom dijelu.

Učitavanje podataka

Prvo što trebamo učiniti je učitati podatke i prikazati ih kao mrežu. Pogledajmo sada svaku točku kao neuron i primijetimo kako su u sivim tonovima. Reći ćemo da neuron nije samo uključen ili isključen, već će biti unutar +1 (crno, uključeno), 0 (sivo, djelomično uključeno / isključeno) i -1 (bijelo, isključeno). Za razliku od našeg mozga, oni će ostati u onom stanju u kojem su zadnji put bili postavljeni.

Potpuni skup podataka sadrži 10.000 napisanih znamenki, podijelit ćemo to na dvije pa imamo set treninga od 8.000 znamenki i test skup od 2.000 znamenki. Prilikom obuke mreže upotrijebit ćemo odgovarajuću numeričku oznaku kako bismo je "naučili". Tijekom testiranja, kartice će se koristiti kao pitanje za ispitivanje vašeg računala kako bi se vidjelo može li ispravno pogoditi. Neće se dati ispravno rješenje.

Mislim da ne vrijedi pokrivati ​​način na koji uvozimo podatke koji su predstavljeni kao skup neobrađenih bajtova, a to je sekundarno funkciji algoritma. Također možete pronaći punu referencu na NMIST bazi podataka u vezi s njenom obradom. Vrijedi naglasiti da je svaka znamenka predstavljena kao objekt klase "Card". Svi se učitavaju pomoću funkcije "loadData ()" koja se poziva prije ičega u "setup ()" i nalazi se izvan klase "Card"

Ulaz 14x14 rešetke daje nam 196 ulaza koji su pohranjeni u jednostavnom nizu. Izlaz se također pohranjuje kao niz od 10 mogućih odgovora, kao +1 ako odgovara izlazu -1 ako ne. Također ćemo pohraniti oznaku kao jednostavnu numeričku sigurnosnu kopiju na izlaze pomoću varijable "label".

Ulazna i neuronska klasa

Sada smo objasnili kako učitati svoje podatke, pa ćemo svaki krug crtati na zaslonu nazvati neuronom.

Započet ćemo s vrlo jednostavnom „Neuron“ klasom s funkcijom prikaza.

Istaknuti izračun unutar „fill ()“ skalira broj od +1 do -1 do broja 0 i 255. Također postoji inverzija za postizanje efekta olovke (crne) i papira (bijele). Živčani neuroni imaju vrijednost koja je blizu +1 koju želimo privući kao crnu ili vrijednost oko 0 kao crnu / sivu ovisno o jačini.

Kreirajmo i klasu "mreža" koju ćemo upotrijebiti za izradu svakog sloja. Ima tri funkcije:

  • Mreža: ovo je inicijator, ovdje postavljamo mrežu s zadanim brojem ulaza, u ovom slučaju to će biti 196 (jedan za svaki piksel).
  • Odgovori: Ovdje odgovaramo na karticu koja se prikazuje, jer ćemo sada samo kopirati ulaz kartice na izlaz kartice bez ikakvih izračuna.
  • Zaslon: Koristi se za crtanje naših 196 neurona u obliku mreže 14x14

Ako sve sastavimo na našoj glavnoj kartici, dobit ćemo nešto ovako:

U ovoj glavnoj kartici koristili smo samo "Mrežnu" klasu, inicijalizira se u "setup ()" sa 196 ulaza (14x14). Zatim testirani set hranimo slučajnim "cardNum" koji nastaje pritiskom miša.

Potpuni kôd za učitavanje i prikaz podataka možete pronaći na GitHub-u. Ne zaboravite uključiti podatke koji se mogu dodati povlačenjem na vašu skicu za obradu.

Ako uživate u ovom, pritisnite

Idite na drugi dio

Izvorni algoritam Alasdaira Turnera