Змест[Схаваць][Паказаць]
Мозг можна параўнаць з нейронавымі сеткамі. Гэта аналогія, якая звычайна выкарыстоўваецца, каб дапамагчы новаму чалавеку зразумець ідэі машыннага навучання і штучных нейронавых сетак.
Паколькі існуе некалькі слаёў матэматычных і статыстычных вылічэнняў, якія адбываюцца за кулісамі, вызначэнне гэтых сетак як матэматычнай функцыі з'яўляецца больш дасканалым метадам.
Гэта для людзей, якія сапраўды зацікаўлены ў машынным навучанні і хочуць убачыць, як пішацца код нейроннай сеткі Python.
У гэтым артыкуле мы прадэманструем, як пабудаваць цалкам злучаную глыбокую нейронавую сетку (DNN) з нуля ў Пітон 3.
Агляд структуры файла для нашага кода нейроннай сеткі Python
Тут будзе створана тры файла. Першы - гэта просты файл nn.py, які будзе абмяркоўвацца ў раздзелах «Наладжванне дапаможных функцый» і «Стварэнне нейронавай сеткі з нуля».
У нас таксама будзе файл з імем mnist loader.py для загрузкі тэставых даных, як апісана ў раздзеле «Загрузка даных MNIST».
Нарэшце, у нас будзе файл пад назвай test.py, які будзе запушчаны ў тэрмінале для тэставання нашай нейронавай сеткі.
Гэты файл падрабязна апісаны ў раздзеле «Запуск тэстаў».
ўстаноўка
Бібліятэку NumPy Python неабходна загрузіць, каб прытрымлівацца гэтага падручніка. Вы можаце зрабіць гэта з дапамогай наступнай каманды на тэрмінале:
Імпарт модуляў і наладжванне функцыі Helper
Нам патрэбны толькі дзве бібліятэкі: random і NumPy, якія мы імпартуем адразу. Для пачатковых вагаў нашай нейронавай сеткі мы ператасуем іх з дапамогай выпадковай бібліятэкі.
Каб паскорыць нашы вылічэнні, мы будзем выкарыстоўваць NumPy або np (па дамоўленасці, ён часта імпартуецца як np). Нашы дзве дапаможныя функцыі будуць зроблены пасля нашага імпарту. Дзве сігмападобныя функцыі: адзін і сігмападобны просты.
Лагістычная рэгрэсія будзе класіфікаваць даныя з дапамогай сігмаіднай функцыі, а зваротнае распаўсюджванне вылічыць дэльта або градыент з дапамогай сігмаіднай простай функцыі.
Стварэнне сеткавага класа
Стварэнне цалкам звязанай нейроннай сеткі з'яўляецца адзінай тэмай гэтага раздзела. Клас сеткі будзе ахопліваць усе наступныя функцыі. Функцыя Object() { [родны код] } будзе першапачаткова створана ў нашым сеткавым класе.
Функцыя Object() { [уласны код] } патрабуе адзін аргумент — sizes. Пераменная sizes - гэта набор лікавых значэнняў, які ўяўляе колькасць уваходных вузлоў, прысутных на кожным узроўні нашай нейронавай сеткі.
Мы ініцыялізуем чатыры ўласцівасці ў нашым метадзе __init__. Уваходныя зменныя, sizes, выкарыстоўваюцца для ўстанаўлення спісу памераў слаёў і колькасці слаёў, num layers адпаведна.
Першы крок - выпадковым чынам прызначыць пачатковыя зрушэнні нашай сеткі кожнаму слою, які ідзе пасля ўваходнага ўзроўню.
Нарэшце, кожная сувязь паміж уваходным і выходным пластамі мае свае вагі, згенераваныя выпадковым чынам. Np.Random.Randn() дае выпадковую выбарку, узятую з звычайнага размеркавання для кантэксту.
Функцыя падачы наперад
У нейронавай сетцы інфармацыя перадаецца наперад з дапамогай функцыі перадачы. Для гэтай функцыі спатрэбіцца адзін аргумент, a, які паказвае бягучы вектар актывацыі.
Гэтая функцыя ацэньвае актывацыі на кожным узроўні, перабіраючы ўсе зрушэнні і вагі ў сетцы. Дадзены адказ - гэта прагноз, які заключаецца ў актывацыі апошняга пласта.
Міні-серыя Градыентны спуск
Рабочы конік нашага сеткавага класа - Gradient Descent. У гэтай версіі мы выкарыстоўваем міні-серыйны (стахастычны) градыентны спуск, мадыфікаваную разнавіднасць градыентнага спуску.
Гэта азначае, што для абнаўлення нашай мадэлі будзе выкарыстоўвацца невялікая партыя кропак даных. У гэты метад перадаюцца чатыры абавязковых і адзін неабавязковы аргумент. Чатыры неабходныя зменныя - гэта набор навучальных даных, колькасць эпох, памер міні-серый і хуткасць навучання (эта).
Тэставыя дадзеныя даступныя па запыце. Мы дамо тэставыя даныя, калі канчаткова ацэнім гэту сетку. Колькасць узораў у гэтай функцыі першапачаткова задаецца роўнай даўжыні спісу пасля таго, як навучальныя даныя былі пераўтвораны ў тып спісу.
Мы таксама прымяняем той жа працэс для праверкі дадзеных, якія ўводзяцца. Гэта адбываецца таму, што замест таго, каб вяртацца нам у выглядзе спісаў, яны сапраўды ўяўляюць сабой паштовыя спісы. Калі мы пазней загрузім узоры даных MNIST, мы даведаемся пра гэта больш.
Калі мы можам пераканацца, што мы прадстаўляем абодва выгляду даных у выглядзе спісаў, то такое прывядзенне тыпаў неабавязкова істотнае.
Калі ў нас ёсць дадзеныя, мы цыклічна праглядаем перыяды навучання. Перыяд навучання - гэта толькі адзін этап навучання нейроннай сеткі. Мы спачатку перамешваем даныя ў кожную эпоху, каб забяспечыць выпадковасць, перш чым скласці спіс міні-партый.
Функцыя абнаўлення міні-серыі, якая разглядаецца ніжэй, будзе выклікацца для кожнай міні-серыі. Дакладнасць тэсту таксама будзе вернута, калі даныя тэсту даступныя.
Вытворная ад выдаткаў дапаможная функцыя
Давайце спачатку распрацуем дапаможную функцыю пад назвай "вытворная кошту", перш чым сапраўды стварыць код зваротнага распаўсюджвання. Калі мы дапусцім памылку ў нашым выхадным пласце, функцыя вытворнай кошту пакажа гэта.
Патрабуюцца два ўводу: масіў выхадных актывацый і y-каардынаты чаканых выхадных значэнняў.
Функцыя зваротнага распаўсюджвання
Наш цяперашні вектар актывацыі, актывацыі, а таксама любыя іншыя вектары актывацыі, актывацыі і z-вектары, zs, усё гэта трэба мець на ўвазе. Першым актывуецца пласт, які называецца ўваходным.
Мы прагледзім кожны ўхіл і вагу пасля іх размяшчэння. Кожны цыкл прадугледжвае вылічэнне вектара z як скаларнага здабытку вагаў і актывацыі, даданне яго ў спіс zs, пераразлік актывацыі і даданне абноўленай актывацыі ў спіс актывацый.
Нарэшце, матэматыка. Дэльта, якая роўная памылцы папярэдняга ўзроўню, памножанай на сігмаідны штрых апошняга элемента вектараў zs, вылічваецца перад тым, як мы пачнем зваротны праход.
Апошні пласт nabla b усталяваны як дэльта, а канчатковы ўзровень nabla w усталяваны ў якасці кропкавага здабытку дэльты і перадапошняга ўзроўню актывацый (транспазіраваных, каб мы маглі падлічыць) .
Мы паступаем, як і раней, пачынаючы з другога пласта і заканчваючы апошнім, і паўтараем працэс пасля завяршэння гэтых апошніх слаёў. Затым наблы вяртаюцца ў выглядзе картэжа.
Абнаўленне міні-пакетнага градыентнага спуску
Наш ранейшы метад SGD (стахастычны градыентны спуск) уключае міні-серыйнае абнаўленне. Паколькі яна выкарыстоўваецца ў SGD, але таксама патрабуе падтрымкі, я абмяркоўваў, дзе размясціць гэтую функцыю.
Нарэшце я вырашыў размясціць яго тут. Ён пачынаецца з генерацыі 0 вектараў зрушэнняў і вагаў, як гэта рабіла наша функцыя бэкпрапа.
У якасці двух уваходных дадзеных патрабуецца міні-серыя і хуткасць навучання eta. Затым у міні-пакеце мы выкарыстоўваем функцыю backprop, каб атрымаць дэльта кожнага масіва nabla для кожнага ўваходу x і выхаду y. Затым спісы nabla абнаўляюцца гэтымі дэльтамі.
Нарэшце, мы выкарыстоўваем каэфіцыент навучання і nablas для абнаўлення вагаў і зрушэнняў сеткі. Кожнае значэнне абнаўляецца да апошняга значэння, за вылікам хуткасці навучання, памнажаецца на памер міні-партыі, а затым дадаецца да значэння nabla.
Ацаніць функцыю
Функцыя ацэнкі - апошняя, якую нам трэба напісаць. Тэставыя даныя - адзіны ўваход для гэтай функцыі. У гэтай функцыі мы толькі параўноўваем вынікі сеткі з чаканым вынікам, y. Па перадачы ўваходу x наперад вызначаюцца выхады сеткі.
Поўны код
Калі мы аб'ядноўваем увесь код, гэта выглядае так.
Тэставанне нейронных сетак
Загрузка даных MNIST
,en Дадзеныя MNIST знаходзіцца ў фармаце .pkl.gz, які мы адкрыем з дапамогай GZIP і загрузім з дапамогай pickle. Давайце напішам хуткі метад загрузкі гэтых даных у выглядзе картэжа памерам тры, падзеленага на навучальныя, праверачныя і тэставыя даныя.
Каб палегчыць кіраванне дадзенымі, мы напішам яшчэ адну функцыю для кадавання y у масіў з 10 элементаў. У масіве будуць усе 0, за выключэннем 1, які адпавядае належнай лічбе выявы.
Мы будзем выкарыстоўваць асноўныя даныя загрузкі і адзін метад гарачага кадавання, каб загрузіць нашы даныя ў зручны для чытання фармат. Будзе напісана іншая функцыя, якая пераўтворыць нашы значэнні x у спіс памерам 784, які адпавядае 784 пікселям выявы, а нашы значэнні y - у адзіную вектарную форму, закадаваную ў гарачым рэжыме.
Затым мы аб'яднаем значэнні x і y так, каб адзін індэкс адпавядаў другому. Гэта адносіцца да набораў дадзеных навучання, праверкі і тэставання. Затым мы вяртаем змененыя дадзеныя.
Запуск тэстаў
Мы створым новы файл пад назвай «загрузчык mnist», які будзе імпартаваць як нейронавую сетку, якую мы стварылі раней (просты nn), так і загрузчык набору даных MNIST перад пачаткам тэсціравання.
У гэтым файле ўсё, што нам трэба зрабіць, гэта імпартаваць даныя, пабудаваць сетку з памерам уваходнага ўзроўню 784 і памерам выхаднога ўзроўню 10, запусціць сеткавую функцыю SGD на навучальных даных, а затым праверыць яе з дапамогай тэставых даных.
Майце на ўвазе, што для нашага спісу ўваходных слаёў няма розніцы, якія лічбы знаходзяцца паміж 784 і 10. Мы можам змяняць іншыя слаі любым спосабам; толькі ўваходныя і выходныя памеры фіксаваныя.
Тры пласта не патрэбныя; мы можам выкарыстоўваць чатыры, пяць ці нават толькі два. Атрымлівайце задавальненне ад эксперыментаў.
заключэнне
Тут, выкарыстоўваючы Python 3, мы ствараем нейрасетку з нуля. Разам з матэматыкай высокага ўзроўню мы абмяркоўвалі і асаблівасці рэалізацыі.
Мы пачалі з рэалізацыі дапаможных функцый. Для таго, каб нейроны працавалі, сігмападобная і сігмападобная простая функцыі маюць вырашальнае значэнне. Затым мы прымяняем на практыцы функцыю перадачы дадзеных, якая з'яўляецца фундаментальным працэсам перадачы даных у нейронавую сетку.
Затым мы стварылі функцыю градыентнага спуску ў Python, механізме, які кіруе нашай нейронавай сеткай. Каб вызначыць месцазнаходжанне «лакальных мінімумаў» і аптымізаваць іх вагі і зрушэнні, наша нейронавая сетка выкарыстоўвае градыентны спуск. Мы стварылі функцыю зваротнага распаўсюджвання з дапамогай градыентны спуск.
Дастаўляючы абнаўленні, калі вынікі не супадаюць з належнымі цэтлікамі, гэтая функцыя дазваляе нейронавай сетцы «навучыцца».
Нарэшце, мы паставілі наш зусім новы Python нейронных сеткі да тэсту з выкарыстаннем набору даных MNIST. Усё працавала гладка.
Шчаслівае кадаванне!
Пакінуць каментар