Բառը[Թաքցնել][Ցուցադրում]
Ուղեղը համեմատելի է նեյրոնային ցանցերի հետ։ Սա այն անալոգիան է, որը սովորաբար օգտագործվում է թեմային նորեկին օգնելու համար հասկանալու մեքենայական ուսուցման և արհեստական նեյրոնային ցանցերի հիմքում ընկած գաղափարները:
Քանի որ կան մաթեմատիկական և վիճակագրական հաշվարկների մի քանի շերտեր, որոնք կատարվում են կուլիսներում, այս ցանցերը որպես մաթեմատիկական ֆունկցիա սահմանելը ավելի առաջադեմ մեթոդ է:
Սա այն մարդկանց համար է, ովքեր իրականում հետաքրքրված են մեքենայական ուսուցմամբ և ցանկանում են տեսնել, թե ինչպես է գրված Python նեյրոնային ցանցի կոդը:
Այս հոդվածում մենք ցույց կտանք, թե ինչպես կարելի է զրոյից կառուցել լիովին միացված խորը նյարդային ցանց (DNN): Python 3.
Մեր Python նեյրոնային ցանցի կոդի ֆայլի կառուցվածքի ակնարկ
Այստեղ կստեղծվեն երեք ֆայլեր: Առաջինը պարզ nn.py ֆայլն է, որը կքննարկվի «Օգնականի գործառույթների կարգավորում» և «Նյարդային ցանցի զրոյից կառուցելը» բաժիններում։
Մենք նաև կունենանք mnist loader.py անունով ֆայլ՝ թեստային տվյալները բեռնելու համար, ինչպես նկարագրված է «Բեռնում MNIST տվյալները»:
Վերջապես, մենք կունենանք test.py անունով ֆայլ, որը կգործարկվի տերմինալում՝ մեր նեյրոնային ցանցը փորձարկելու համար:
Այս ֆայլը մանրամասն նկարագրված է «Գործող թեստերում»:
տեղակայում
NumPy Python գրադարանը պետք է ներբեռնվի այս ձեռնարկին հետևելու համար: Դուք կարող եք դա իրականացնել՝ օգտագործելով հետևյալ հրամանը տերմինալի վրա.
Մոդուլների ներմուծում և Օգնական գործառույթի կարգավորում
Միակ երկու գրադարանները, որոնք մենք պահանջում ենք, պատահական և NumPy են, որոնք մենք անմիջապես կներկրենք: Մեր նեյրոնային ցանցի սկզբնական կշիռների համար մենք դրանք կխառնենք՝ օգտագործելով պատահական գրադարանը:
Մեր հաշվարկներն արագացնելու համար մենք կօգտագործենք NumPy կամ np (ըստ պայմանի, այն հաճախ ներմուծվում է որպես np): Մեր երկու օգնական գործառույթները կկատարվեն մեր ներմուծումից հետո։ Երկու սիգմոիդ ֆունկցիա՝ մեկ և սիգմոիդ պարզ:
Լոգիստիկ ռեգրեսիան կդասակարգի տվյալները՝ օգտագործելով սիգմոիդ ֆունկցիան, մինչդեռ հետտարածումը կհաշվի դելտան կամ գրադիենտը՝ օգտագործելով սիգմոիդ պրիմ ֆունկցիան:
Ցանցային դասի ստեղծում
Ամբողջովին կապակցված նեյրոնային ցանցի կառուցումը այս բաժնի միակ նպատակն է: Ցանցի դասը կներառի բոլոր այն գործառույթները, որոնք հաջորդում են: Object() { [native code] } ֆունկցիան ի սկզբանե կստեղծվի մեր ցանցային դասում:
Մեկ արգումենտ՝ չափերը, պահանջվում է Object() { [native code] } ֆունկցիայի համար: Չափերի փոփոխականը թվային արժեքների հավաքածու է, որը ներկայացնում է մեր նեյրոնային ցանցի յուրաքանչյուր շերտում առկա մուտքային հանգույցների քանակը:
Մենք նախաստորագրում ենք չորս հատկություն մեր __init__ մեթոդով: Մուտքային փոփոխականները՝ չափերը, օգտագործվում են համապատասխանաբար շերտերի չափերի ցանկը և շերտերի քանակը՝ num շերտերը սահմանելու համար։
Առաջին քայլը մեր ցանցի սկզբնական կողմնակալությունները պատահականորեն վերագրելն է յուրաքանչյուր շերտին, որը հաջորդում է մուտքային շերտին:
Ի վերջո, մուտքային և ելքային շերտերի միջև յուրաքանչյուր կապ ունի իր կշիռները պատահականորեն: Np.Random.Randn()-ը տալիս է պատահական նմուշ, որը վերցված է նորմալ բաշխումից համատեքստի համար:
Feed Forward գործառույթը
Նյարդային ցանցում տեղեկատվությունը առաջ է ուղարկվում հետադարձ ֆունկցիայի միջոցով: Այս ֆունկցիայի համար կպահանջվի մեկ արգումենտ՝ a, որը ցույց է տալիս ընթացիկ ակտիվացման վեկտորը:
Այս ֆունկցիան գնահատում է ակտիվացումները յուրաքանչյուր շերտում՝ կրկնելով ցանցի բոլոր կողմնակալությունները և կշիռները: Տրված պատասխանը կանխատեսումն է, որը վերջին շերտի ակտիվացումներն են։
Մինի խմբաքանակի գրադիենտ ծագում
Մեր «Ցանց» դասի աշխատանքային ձին է Gradient Descent-ը: Այս տարբերակում մենք օգտագործում ենք մինի խմբաքանակի (ստոխաստիկ) գրադիենտ ծագում, գրադիենտ ծագման փոփոխված տարբերակ:
Սա ցույց է տալիս, որ տվյալների կետերի փոքր փաթեթը կօգտագործվի մեր մոդելը թարմացնելու համար: Չորս պահանջվող և մեկ ընտրովի արգումենտ փոխանցվում են այս մեթոդին: Պահանջվող չորս փոփոխականներն են՝ վերապատրաստման տվյալների հավաքածուն, դարաշրջանների քանակը, մինի խմբաքանակների չափը և ուսուցման արագությունը (eta):
Փորձարկման տվյալները հասանելի են ըստ պահանջի: Մենք կներկայացնենք թեստի տվյալները, երբ ի վերջո գնահատենք այս ցանցը: Այս ֆունկցիայի նմուշների թիվը սկզբում սահմանվում է ցուցակի երկարության վրա, երբ վերապատրաստման տվյալները վերածվեն ցուցակի տեսակի:
Մենք նաև կիրառում ենք նույն գործընթացը՝ տրված տվյալների փորձարկման համար: Դա պայմանավորված է նրանով, որ մեզ որպես ցուցակներ վերադարձնելու փոխարեն, դրանք իսկապես ցուցակների զիփ են: Երբ մենք ավելի ուշ բեռնենք MNIST տվյալների նմուշները, մենք ավելին կիմանանք այս մասին:
Եթե մենք կարողանանք համոզվել, որ մենք տրամադրում ենք երկու տեսակի տվյալներ որպես ցուցակներ, ապա այս տեսակի ձուլումը պարտադիր չէ, որ էական լինի:
Երբ մենք ունենք տվյալներ, մենք անցնում ենք վերապատրաստման դարաշրջանները մի օղակով: Վերապատրաստման շրջանը նեյրոնային ցանցի ուսուցման միայն մեկ փուլ է: Մենք նախ խառնում ենք տվյալները յուրաքանչյուր դարաշրջանում, որպեսզի ապահովենք պատահականությունը՝ նախքան մինի-խմբաքանակների ցուցակ կազմելը:
Թարմացման մինի խմբաքանակի գործառույթը, որը քննարկվում է ստորև, կկանչվի յուրաքանչյուր մինի խմբաքանակի համար: Թեստի ճշգրտությունը նույնպես կվերադարձվի, եթե թեստի տվյալները հասանելի լինեն:
Ծախսերի ածանցյալ օգնական ֆունկցիա
Եկեք նախ մշակենք օգնական ֆունկցիա, որը կոչվում է ծախսերի ածանցյալ, նախքան իրականում ստեղծել ենք հետտարածման կոդը: Եթե մենք սխալ թույլ տանք մեր ելքային շերտում, դա ցույց կտա ծախսերի ածանցյալ ֆունկցիան:
Այն պահանջում է երկու մուտք՝ ելքային ակտիվացման զանգված և ակնկալվող ելքային արժեքների y կոորդինատներ:
Հետ տարածման ֆունկցիա
Մեր ներկայիս ակտիվացման վեկտորը, ակտիվացումը, ինչպես նաև ցանկացած այլ ակտիվացման վեկտորներ, ակտիվացումներ և z-վեկտորներ, zs, բոլորը պետք է հիշել: Սկզբում ակտիվանում է մի շերտ, որը կոչվում է մուտքային շերտ:
Մենք կանցնենք յուրաքանչյուր կողմնակալության և քաշի միջոցով դրանք դնելուց հետո: Յուրաքանչյուր օղակ ներառում է z վեկտորի հաշվարկը որպես կշիռների և ակտիվացման կետային արտադրյալ, այն ավելացնելով zs-ների ցանկին, վերահաշվարկել ակտիվացումը և թարմացված ակտիվացումը ավելացնել ակտիվացումների ցանկում:
Վերջապես, մաթեմատիկան. Դելտան, որը հավասար է նախորդ շերտի սխալին, որը բազմապատկվում է zs վեկտորների վերջին տարրի սիգմոիդ պարզությամբ, հաշվարկվում է նախքան մենք կսկսենք մեր հետընթաց անցումը:
Նաբլա b-ի վերջին շերտը սահմանվում է որպես դելտան, իսկ nabla w-ի վերջնական շերտը՝ դելտայի կետային արտադրյալը և ակտիվացման երկրորդից վերջին շերտը (փոխադրված, որպեսզի մենք իրականում կարողանանք հաշվարկել): .
Շարունակում ենք նախկինի պես՝ սկսելով երկրորդ շերտից և եզրափակելով վերջինով, և այս վերջին շերտերն ավարտելուց հետո կրկնում ենք գործընթացը։ Այնուհետև նաբլաները վերադարձվում են բազմակի տեսքով:
Մինի խմբաքանակի գրադիենտ անկումը թարմացվում է
Մեր SGD (ստոխաստիկ գրադիենտ ծագում) մեթոդը նախկինում ներառում է մինի-խմբաքանակի թարմացում: Քանի որ այն օգտագործվում է SGD-ում, բայց նաև պահանջում է backprop, ես քննարկեցի, թե որտեղ դնել այս գործառույթը:
Ի վերջո, ես ընտրություն կատարեցի տեղադրել այն այստեղ: Այն սկսվում է շեղումների և կշիռների նաբլաների 0 վեկտորների ստեղծմամբ, ինչպես դա արեց մեր backprop ֆունկցիան:
Այն պահանջում է մինի-խմբաքանակը և eta-ի ուսուցման արագությունը որպես իր երկու մուտքեր: Մինի խմբաքանակում մենք այնուհետև օգտագործում ենք backprop ֆունկցիան՝ յուրաքանչյուր մուտքագրման համար յուրաքանչյուր nabla զանգվածի դելտան ստանալու համար՝ x և ելք՝ y: Այնուհետև նաբլաների ցուցակները թարմացվում են այս դելտաներով:
Վերջապես, մենք օգտագործում ենք ուսուցման արագությունը և nablas-ը՝ ցանցի կշիռներն ու կողմնակալությունները թարմացնելու համար: Յուրաքանչյուր արժեք թարմացվում է մինչև ամենավերջին արժեքը՝ հանած ուսուցման արագությունը, բազմապատկվում է մինի փաթեթի չափով, այնուհետև ավելացվում է nabla արժեքին:
Գնահատել գործառույթը
Գնահատման ֆունկցիան վերջինն է, որը մենք պետք է գրենք: Թեստի տվյալները այս ֆունկցիայի միակ մուտքն են: Այս գործառույթում մենք միայն համեմատում ենք ցանցի ելքերը ակնկալվող արդյունքի հետ՝ y: Սնուցելով մուտքը, x, առաջ, որոշվում են ցանցի ելքերը։
Ամբողջական կոդը
Երբ մենք միավորում ենք ամբողջ ծածկագիրը, այն հայտնվում է այսպես.
Նյարդային ցանցի փորձարկում
MNIST-ի տվյալները բեռնվում են
The MNIST տվյալները գտնվում է .pkl.gz ձևաչափով, որը մենք կբացենք GZIP-ի միջոցով և կբեռնենք թթու վարունգով: Եկեք գրենք արագ մեթոդ այս տվյալները բեռնելու համար երեք չափի կրկնակի՝ բաժանված վերապատրաստման, վավերացման և փորձարկման տվյալների:
Մեր տվյալների կառավարումը հեշտացնելու համար մենք կգրենք ևս մեկ ֆունկցիա՝ y-ը 10 տարրանոց զանգվածի մեջ կոդավորելու համար: Զանգվածը կլինի բոլոր 0-երը, բացառությամբ 1-ի, որը համապատասխանում է պատկերի ճիշտ թվանշանին:
Մենք կօգտագործենք հիմնական բեռնման տվյալները և մեկ տաք կոդավորման մեթոդ՝ մեր տվյալները ընթեռնելի ձևաչափով բեռնելու համար: Կգրվի մեկ այլ ֆունկցիա, որը մեր x արժեքները կվերածի 784 չափսի ցուցակի, որը կհամապատասխանի պատկերի 784 պիքսելներին, իսկ մեր y արժեքները՝ իրենց մեկ տաք կոդավորված վեկտորային ձևի:
Այնուհետև մենք կմիավորենք x և y արժեքներն այնպես, որ մի ինդեքսը համապատասխանի մյուսին: Սա վերաբերում է վերապատրաստման, վավերացման և փորձարկման տվյալների հավաքածուներին: Այնուհետև մենք վերադարձնում ենք փոփոխված տվյալները:
Վազքային թեստեր
Մենք կստեղծենք նոր ֆայլ, որը կոչվում է «mnist loader», որը կներմուծի ինչպես նախկինում ստեղծած նեյրոնային ցանցը (պարզ nn), այնպես էլ MNIST տվյալների հավաքածուի բեռնիչը՝ նախքան փորձարկումը սկսելը:
Այս ֆայլում մեզ անհրաժեշտ է ընդամենը ներմուծել տվյալները, կառուցել 784 մուտքային շերտի չափով և 10 ելքային շերտի չափով ցանց, գործարկել ցանցի SGD ֆունկցիան ուսուցման տվյալների վրա, այնուհետև փորձարկել այն՝ օգտագործելով թեստային տվյալները:
Նկատի ունեցեք, որ մեր մուտքային շերտերի ցանկի համար տարբերություն չկա, թե ինչ թվեր են գտնվում 784-ի և 10-ի միջև: պարզապես մուտքային և ելքային չափերը ամրագրված են:
Երեք շերտ անհրաժեշտ չէ. մենք կարող ենք օգտագործել չորս, հինգ կամ նույնիսկ երկուսը: Զվարճացեք դրա հետ փորձարկելով:
Եզրափակում
Այստեղ, օգտագործելով Python 3-ը, մենք զրոյից ստեղծում ենք նեյրոնային ցանց։ Բարձր մակարդակի մաթեմատիկայի հետ մեկտեղ քննարկել ենք նաև իրականացման առանձնահատկությունները։
Մենք սկսեցինք օգնականի գործառույթների ներդրմամբ: Նեյրոնների աշխատանքի համար կարևոր են սիգմոիդ և սիգմոիդ հիմնական գործառույթները: Այնուհետև մենք կիրառում ենք հետադարձ գործառույթը, որը տվյալների նեյրոնային ցանցին սնուցման հիմնական գործընթացն է:
Այնուհետև մենք ստեղծեցինք գրադիենտ վայրէջքի ֆունկցիան Python-ում, այն շարժիչը, որը վարում է մեր նեյրոնային ցանցը: «Տեղական նվազագույնները» գտնելու և դրանց կշիռներն ու կողմնակալությունները օպտիմալացնելու համար մեր նեյրոնային ցանցն օգտագործում է գրադիենտ ծագում: Մենք ստեղծել ենք backpropagation ֆունկցիան՝ օգտագործելով գրադիենտ վայրէջք.
Թարմացումներ տրամադրելով, երբ ելքերը չեն համապատասխանում համապատասխան պիտակներին, այս ֆունկցիան նեյրոնային ցանցին հնարավորություն է տալիս «սովորել»:
Վերջապես, մենք դրեցինք մեր բոլորովին նոր Python-ը նյարդային ցանց թեստին՝ օգտագործելով MNIST տվյալների հավաքածուն: Ամեն ինչ հարթ էր գործում։
Շնորհավոր կոդավորում:
Թողնել գրառում