Преглед садржаја[Сакрити][Прикажи]
Мозак је упоредив са неуронским мрежама. Ово је аналогија која се обично користи да би се помогло некоме ко је нови у овој теми да разуме идеје иза машинског учења и вештачких неуронских мрежа.
Пошто постоји неколико слојева математичких и статистичких прорачуна који се одвијају иза сцене, дефинисање ових мрежа као математичке функције је напреднија метода.
Ово је за људе који су заиста заинтересовани за машинско учење и желе да виде како је написан код Питхон неуронске мреже.
У овом чланку ћемо показати како да се направи потпуно повезана дубока неуронска мрежа (ДНН) од нуле у Питон 3.
Преглед структуре датотеке за наш Питхон код неуронске мреже
Овде ће бити креиране три датотеке. Прва је једноставна датотека нн.пи, о којој ће бити речи у одељцима „Подешавање помоћних функција“ и „Изградња неуронске мреже од нуле“.
Такође ћемо имати датотеку под називом мнист лоадер.пи за учитавање тестних података, као што је описано у „Учитавање МНИСТ података“.
Коначно, имаћемо датотеку под називом тест.пи која ће бити покренута у терминалу да тестира нашу неуронску мрежу.
Ова датотека је детаљно описана у „Покретању тестова“.
инсталација
НумПи Питхон библиотека мора бити преузета да бисте пратили овај водич. Ово можете постићи коришћењем следеће команде на терминалу:
Увоз модула и подешавање функције помоћника
Једине две библиотеке које су нам потребне су рандом и НумПи, које ћемо одмах увести. За почетне тежине наше неуронске мреже, ми ћемо их измешати користећи насумичне библиотеке.
Да бисмо убрзали наше прорачуне, користићемо НумПи или нп (по конвенцији се често увози као нп). Наше две помоћне функције ће бити направљене након нашег увоза. Две сигмоидне функције: једна и сигмоидна примена.
Логистичка регресија ће класификовати податке користећи сигмоидну функцију, док ће бацкпропагација израчунати делта или градијент користећи сигмоидну примарну функцију.
Креирање мрежне класе
Изградња потпуно повезане неуронске мреже је једини фокус овог одељка. Мрежна класа ће обухватити све функције које долазе после. Функција Објецт() { [нативни код] } ће бити креирана у почетку у нашој мрежној класи.
Функција Објецт() { [нативни код] } захтева један аргумент, величине. Варијабла сизес је колекција нумеричких вредности која представља број улазних чворова присутних у сваком слоју наше неуронске мреже.
Иницијализујемо четири својства у нашој методи __инит__. Улазне варијабле, величине, користе се за постављање листе величина слојева и броја слојева, односно броја слојева.
Први корак је да насумично доделимо почетне предрасуде наше мреже сваком слоју који прати улазни слој.
Коначно, свака веза између улазног и излазног слоја има своје тежине насумично генерисане. Нп.Рандом.Рандн() даје случајни узорак извучен из нормалне дистрибуције за контекст.
Функција напред
У неуронској мрежи, информације се шаљу унапред помоћу функције феедфорвард. Ова функција ће захтевати један аргумент, а, који означава тренутни вектор активације.
Ова функција процењује активације на сваком слоју итерацијом преко свих предрасуда и тежине у мрежи. Дати одговор је предвиђање, што је активација последњег слоја.
Мини-серија Градијентног спуштања
Радни коњ наше класе Мреже је Градиент Десцент. У овој верзији користимо мини-батцх (стохастички) градијентни спуст, модификовану варијацију градијентног спуштања.
Ово указује да ће се мала серија тачака података користити за ажурирање нашег модела. Четири обавезна и један опциони аргумент се прослеђују овом методу. Четири потребне варијабле су скуп података за обуку, број епоха, величина мини серија и стопа учења (ета).
Подаци о тесту су доступни на захтев. Испоручићемо тестне податке када на крају проценимо ову мрежу. Број узорака у овој функцији је иницијално постављен на дужину листе када се подаци о обуци трансформишу у тип листе.
Исти процес примењујемо и на тестне податке који су дати. То је зато што уместо да нам се врате као листе, они су заиста зипови листа. Када касније учитамо МНИСТ узорке података, сазнаћемо више о томе.
Ако можемо да обезбедимо обе врсте података као листе, онда ово преливање типа није нужно неопходно.
Када имамо податке, прелазимо кроз епохе обуке у петљи. Период обуке је само један круг обуке неуронске мреже. Прво измешамо податке у свакој епохи да бисмо обезбедили случајност пре него што направимо листу мини серија.
Функција мини пакета ажурирања, о којој се говори у наставку, биће позвана за сваки мини пакет. Тачност теста ће такође бити враћена ако су подаци теста доступни.
Помоћна функција која се заснива на трошковима
Хајде да прво развијемо помоћну функцију која се зове дериват трошкова пре него што заиста креирамо код за ширење уназад. Ако направимо грешку у нашем излазном слоју, функција деривата трошкова ће то показати.
Захтева два улаза: низ излазних активација и и-координате предвиђених излазних вредности.
Функција пропагације уназад
Наш садашњи вектор активације, активација, као и било који други активациони вектори, активације и з-вектори, зс, морају се имати на уму. Прво се активира слој који се зове улазни слој.
Прегледаћемо сваку пристрасност и тежину након што их поставимо. Свака петља укључује израчунавање з вектора као тачкастог производа тежине и активације, додавање на листу зс, поновно израчунавање активације и додавање ажуриране активације на листу активација.
Коначно, математика. Делта, која је једнака грешци из претходног слоја помноженој са сигмоидним простим бројем последњег елемента зс вектора, израчунава се пре него што почнемо назад.
Последњи слој набла б је постављен да буде делта, а последњи слој набла в је подешен да буде тачкасти производ делте и претпоследњег слоја активација (транспоновано тако да заправо можемо да израчунамо) .
Настављамо као и раније, почевши од другог слоја и закључно са последњим, и понављамо процес након завршетка ових последњих слојева. Набла се затим враћа као торка.
Ажурирање Мини-серије градијента спуштања
Наш метод СГД (стохастичког градијента) од раније укључује ажурирање мини серије. Пошто се користи у СГД-у, али такође захтева бацкпроп, расправљао сам где да ставим ову функцију.
Коначно, одлучио сам да га објавим овде. Почиње генерисањем 0 вектора наблас предрасуда и тежине, баш као што је то урадила наша бацкпроп функција.
Захтева мини-батцх и ета стопу учења као своја два улаза. У мини-батцх-у, тада користимо функцију бацкпроп да бисмо добили делту сваког набла низа за сваки улаз, к и излаз, и. Набла листе се затим ажурирају овим делтама.
Коначно, користимо брзину учења и наблас да ажурирамо тежине и предрасуде мреже. Свака вредност се ажурира на најновију вредност, умањену за стопу учења, помножену величином мини серије, а затим додају набла вредности.
Процените функцију
Функција евалуације је последња коју треба да напишемо. Тест подаци су једини улаз за ову функцију. У овој функцији само поредимо излазе мреже са очекиваним резултатом, и. Напајањем улаза, к, унапред, одређују се излази мреже.
Комплетан код
Када комбинујемо сав код, изгледа овако.
Тестирање неуронске мреже
Учитавање МНИСТ података
МНИСТ подаци је у .пкл.гз формату, који ћемо отворити помоћу ГЗИП-а и учитати га са пицкле-ом. Хајде да напишемо брзи метод за учитавање ових података као торку величине три, подељену на податке за обуку, валидацију и тест.
Да бисмо олакшали управљање нашим подацима, написаћемо другу функцију за кодирање и у низ од 10 ставки. Низ ће имати све 0 осим 1 која одговара правилној цифри слике.
Користићемо основне податке за учитавање и један метод врућег кодирања да учитамо наше податке у читљив формат. Биће написана још једна функција која ће конвертовати наше к вредности у листу величине 784, која одговара 784 пиксела слике, а наше и вредности у њихов јединствени врући кодирани векторски облик.
Затим ћемо комбиновати вредности к и и тако да један индекс одговара другом. Ово се односи на скупове података за обуку, валидацију и тестирање. Затим враћамо измењене податке.
Руннинг Тестс
Направићемо нову датотеку под називом „мнист лоадер“ која ће увести и неуронску мрежу коју смо претходно успоставили (једноставан нн) и учитавач скупа података МНИСТ пре него што почнемо са тестирањем.
У овој датотеци, све што треба да урадимо је да увеземо податке, изградимо мрежу са величином улазног слоја од 784 и величином излазног слоја од 10, покренемо СГД функцију мреже на подацима о обуци, а затим је тестирамо користећи податке теста.
Имајте на уму да за нашу листу улазних слојева није битно који су бројеви између 784 и 10. Остале слојеве можемо мењати на било који начин; само су улазне и излазне величине фиксне.
Три слоја нису неопходна; могли бисмо користити четири, пет или чак само два. Забавите се експериментисањем с тим.
Zakljucak
Овде, користећи Питхон 3, креирамо неуронску мрежу од нуле. Уз математику високог нивоа, разговарали смо и о специфичностима имплементације.
Почели смо са имплементацијом помоћних функција. Да би неурони функционисали, основне функције сигмоида и сигмоида су кључне. Затим смо применили у пракси функцију унапред, што је основни процес за унос података у неуронску мрежу.
Затим смо креирали функцију градијента спуштања у Питхон-у, мотору који покреће нашу неуронску мрежу. Да би лоцирали „локалне минимуме“ и оптимизовали њихове тежине и предрасуде, наша неуронска мрежа користи градијентни спуст. Направили смо функцију пропагације уназад користећи градијентно спуштање.
Испоруком ажурирања када се излази не подударају са одговарајућим ознакама, ова функција омогућава неуронској мрежи да „учи“.
Коначно, поставили смо наш потпуно нови Питхон неуронска мрежа на тест користећи МНИСТ скуп података. Све је функционисало глатко.
Срећно кодирање!
Ostavite komentar