Мазмуну[Жашыруу][Көрсөтүү]
Мээни нейрон тармактарына салыштырууга болот. Бул, адатта, машина үйрөнүү жана жасалма нейрон тармактары артында идеяларды түшүнүүгө темага жаңы кимдир бирөө жардам берүү үчүн колдонулат окшоштук болуп саналат.
Көшөгө артында жүрүп жаткан математикалык жана статистикалык эсептөөлөрдүн бир нече катмарлары болгондуктан, бул тармактарды математикалык функция катары аныктоо өнүккөн ыкма болуп саналат.
Бул чындыгында машина үйрөнүүгө кызыккан жана Python нейрондук тармак коду кантип жазылганын көргүсү келген адамдар үчүн.
Бул макалада биз толугу менен туташкан терең нейрон тармагын (DNN) нөлдөн баштап кантип курууну көрсөтөбүз Python 3.
Биздин Python Neural Network Code үчүн файл түзүмүн карап чыгуу
Бул жерде үч файл түзүлөт. Биринчиси - жөнөкөй nn.py файлы, ал "Жардамчы функцияларды орнотуу" жана "Нелден баштап нейрон тармагын куруу" бөлүмдөрүндө талкууланат.
Ошондой эле "MNIST маалыматтарын жүктөө" бөлүмүндө сүрөттөлгөндөй, сыноо берилиштерин жүктөө үчүн mnist loader.py деп аталган файлыбыз болот.
Акырында, нейрон тармагыбызды текшерүү үчүн терминалда ишке киргизиле турган test.py аттуу файлыбыз болот.
Бул файл "Иштеп жаткан сыноолордо" кеңири сүрөттөлгөн.
орнотуу
Бул окуу куралын аткаруу үчүн NumPy Python китепканасын жүктөп алуу керек. Муну терминалда төмөнкү буйрукту колдонуу менен аткара аласыз:
Модулдарды импорттоо жана Жардамчы функциясын орнотуу
Бизге талап кылынган эки гана китепкана - кокустук жана NumPy, биз аларды дароо импорттойбуз. Нейрондук тармактын баштапкы салмактары үчүн биз аларды кокус китепкана аркылуу аралаштырабыз.
Эсептөөлөрдү тездетүү үчүн биз NumPy же np колдонобуз (шарт боюнча, ал көбүнчө np катары импорттолот). Биздин эки жардамчы функциябыз импорттон кийин жасалат. Эки сигмоиддик функциялар: бир жана сигмоиддүү прайм.
Логистикалык регрессия сигмоиддик функцияны колдонуу менен маалыматтарды классификациялайт, ал эми артка жайылуу сигмоиддик негизги функцияны колдонуу менен дельтаны же градиентти эсептейт.
Тармак классын түзүү
Толугу менен байланышкан нейрон тармагын куруу бул бөлүмдүн бирден-бир максаты болуп саналат. Тармак классы андан кийин келген бардык функцияларды камтыйт. Object() { [түпкү код] } функциясы алгач биздин тармак классыбызда түзүлөт.
Object() { [түпкү код] } функциясы үчүн бир аргумент, өлчөмдөр талап кылынат. Өлчөмдөрдүн өзгөрмөсү – бул нейрон тармагыбыздын ар бир катмарында болгон киргизүү түйүндөрүнүн санын билдирген сандык маанилердин жыйындысы.
Биз __init__ методубузда төрт касиетти инициализациялайбыз. Киргизилген өзгөрмөлөр, өлчөмдөр, тиешелүүлүгүнө жараша катмардын өлчөмдөрүнүн тизмесин жана катмарлардын санын, катмарлардын санын орнотуу үчүн колдонулат.
Биринчи кадам - бул киргизүү катмарынан кийинки ар бир катмарга биздин тармактын баштапкы багыттарын кокусунан дайындоо.
Акыр-аягы, киргизүү жана чыгаруу катмарларынын ортосундагы ар бир шилтеме туш келди түзүлгөн анын салмагы бар. Np.Random.Randn() контекст үчүн нормалдуу бөлүштүрүүдөн алынган кокустук үлгүнү берет.
Feed Forward Function
Нейрондук тармакта маалымат алдыга берүү функциясы аркылуу жөнөтүлөт. Бул функцияга учурдагы активдештирүү векторун көрсөтүүчү бир аргумент, а талап кылынат.
Бул функция ар бир катмардагы активдештирүүлөрдү тармактагы бардык бурмалоолорду жана салмактарды кайталоо менен баалайт. Берилген жооп - бул акыркы катмардын активдештирүүлөрү болгон болжолдоо.
Мини-топтом Градиенттин түшүүсү
Тармак классыбыздын негизги багыты - градиенттик түшүү. Бул версияда биз мини-топтомдук (стохастикалык) градиент түшүүсүн, градиенттүү түшүүнүн өзгөртүлгөн вариациясын колдонобуз.
Бул биздин моделди жаңыртуу үчүн маалымат чекиттеринин кичинекей партиясы колдонула турганын көрсөтүп турат. Бул ыкмага төрт талап кылынган жана бир кошумча аргумент өткөрүлөт. Төрт талап кылынган өзгөрмөлөр бул окутуу маалыматтарынын топтому, доорлордун саны, кичи партиялардын өлчөмү жана үйрөнүү ылдамдыгы (эта).
Сыноо маалыматтары суроо-талабы боюнча жеткиликтүү. Бул тармакты баалагандан кийин, биз сыноо дайындарын беребиз. Бул функциядагы үлгүлөрдүн саны алгач окуу маалыматтары тизме түрүнө айландырылгандан кийин тизменин узундугуна коюлат.
Берилген маалыматтарды сыноо үчүн да ошол эле процессти колдонобуз. Себеби алар бизге тизме катары кайтарылып берилбестен, чындыгында тизмелердин zip болуп саналат. MNIST маалымат үлгүлөрүн кийинчерээк жүктөгөндө, биз бул тууралуу көбүрөөк билебиз.
Эгерде биз эки түрдүү маалыматтарды тизмелер катары бергенибизге ынансак, анда бул типти кастинг сөзсүз түрдө маанилүү эмес.
Маалыматтарга ээ болгондон кийин, биз циклде окутуу доорлорун карап чыгабыз. Окутуу мезгили нейрон тармагын окутуунун бир гана раунду. Мини-партиялардын тизмесин түзүүдөн мурун кокустуктун болушун камсыз кылуу үчүн биз адегенде ар бир доордо маалыматтарды аралаштырабыз.
Төмөндө талкууланган жаңыртуу мини партия функциясы ар бир мини-партия үчүн чакырылат. Сыноонун тактыгы, эгерде тесттин маалыматтары бар болсо, кайтарылып берилет.
Чыгымдардын туунду жардамчы функциясы
Келгиле, артка жайылтуу кодун түзүүдөн мурун, адегенде чыгымдын туундусу деп аталган жардамчы функцияны иштеп чыгалы. Эгерде биз чыгаруу катмарында ката кетирсек, аны чыгымдын туунду функциясы көрсөтөт.
Ал эки киргизүүнү талап кылат: чыгаруу активдештирүү массиви жана күтүлгөн чыгаруу маанилеринин y-координаттары.
Артка жайылтуу функциясы
Биздин азыркы активдештирүү векторубуз, активдештирүү, ошондой эле башка активдештирүү векторлору, активдештирүү жана z-векторлор, zs, бардыгын эстен чыгарбоо керек. Киргизүү катмары деп аталган катмар алгач иштетилет.
Аларды орноткондон кийин, биз ар бир тенденцияны жана салмакты карап чыгабыз. Ар бир цикл z векторун салмактардын жана активдештирүүнүн чекиттик продуктусу катары эсептөөнү, аны zs тизмесине кошууну, активдештирүүнү кайра эсептөөнү жана активдештирүүлөрдүн тизмесине жаңыланган активдештирүүнү камтыйт.
Акыры, математика. Мурунку катмардын катасынын zs векторлорунун акыркы элементинин сигма сымал жайына көбөйтүлгөнүнө барабар болгон дельта артка өтүүнү баштоодон мурун эсептелет.
nabla b акыркы катмары дельта болуп орнотулган, ал эми nabla w акыркы катмары дельтанын чекит продуктусу жана активдештирүүнүн экинчиден акыркы катмары болуп орнотулган (биз чындыгында математиканы жасай алышыбыз үчүн которулган) .
Биз мурункудай улантабыз, экинчи катмардан башталып, акыркысы менен жыйынтыкталат жана бул акыркы катмарларды аяктагандан кийин процессти кайталайбыз. Андан кийин наблалар кортеж катары кайра берилет.
Мини-топтомдук градиенттин түшүүсү жаңыртылууда
Биздин SGD (стохастикалык градиенттүү түшүү) методубузда мини-партиялык жаңыртуу камтылган. Ал SGDде колдонулгандыктан, бирок ошондой эле арткы жабышты талап кылгандыктан, мен бул функцияны кайда коюуну талкууладым.
Акыры, мен аны бул жерге жайгаштырууну чечтим. Ал биздин backprop функциябыз сыяктуу, 0 векторлорду жана салмактардын набласын түзүү менен башталат.
Ал эки киргизүү катары мини-партияны жана эта үйрөнүү курсун талап кылат. Мини-партияда биз ар бир кириш, х жана чыгаруу үчүн ар бир набла массивинин дельтасын алуу үчүн backprop функциясын колдонобуз. Андан кийин набла тизмелери бул дельталар менен жаңыланат.
Акырында, биз үйрөнүү ылдамдыгын жана набластарды тармактын салмагын жана бурмалоолорун жаңыртуу үчүн колдонобуз. Ар бир маани эң акыркы мааниге жаңыртылып, үйрөнүү ылдамдыгын азайтып, минибатчтын өлчөмүнө көбөйтүлүп, андан кийин набла маанисине кошулат.
Функцияны баалоо
Баалоо функциясы - бул биз жазышыбыз керек болгон акыркы функция. Сыноо маалыматтары бул функция үчүн жалгыз киргизүү болуп саналат. Бул функцияда биз тармактын жыйынтыктарын күтүлгөн натыйжа менен гана салыштырабыз, y. Киргизүүнү азыктандыруу менен, х, алдыга, тармактын чыгуулары аныкталат.
Толук Code
Бардык кодду бириктиргенде, ал ушундай болот.
Нейрондук тармакты текшерүү
MNIST маалыматтары жүктөлүүдө
The MNIST маалыматтары .pkl.gz форматында, биз аны GZIP аркылуу ачып, туздалган балык менен жүктөйбүз. Келгиле, бул маалыматтарды үч өлчөмүндөгү кортеж катары жүктөөнүн тез ыкмасын жазып көрөлү, окутуу, текшерүү жана сыноо маалыматтарына бөлүнөт.
Дайындарыбызды башкарууну жеңилдетүү үчүн, биз 10 элементтен турган массивге y коддоо үчүн дагы бир функцияны жазабыз. Массив сүрөттүн тиешелүү цифрасына дал келген 0ден башкасынын баары 1 болот.
Дайындарыбызды окула турган форматка жүктөө үчүн биз негизги жүктөө дайындарын жана бир ысык коддоо ыкмасын колдонобуз. Дагы бир функция жазылат, ал биздин x маанилерибизди сүрөттүн 784 пикселине дал келген 784 өлчөмүндөгү тизмеге, ал эми биздин у маанилерибизди алардын бирдиктүү ысык коддолгон вектордук формасына айлантат.
Андан кийин биз бир индекс экинчисине дал келгидей кылып x жана y маанилерин бириктиребиз. Бул окутуу, текшерүү жана тесттик маалымат топтомуна тиешелүү. Андан кийин биз өзгөртүлгөн маалыматтарды кайтарабыз.
Running Tests
Биз "mnist loader" деп аталган жаңы файлды жасайбыз, ал биз тестирлөөдөн мурун биз мурда орноткон нейрон тармагын (жөнөкөй nn) жана MNIST маалыматтар топтомун жүктөгүчтү импорттойт.
Бул файлда, биз эмне кылышыбыз керек, маалыматтарды импорттоо, киргизүү катмарынын өлчөмү 784 жана чыгаруу катмарынын өлчөмү 10 болгон тармакты куруу, окутуу маалыматтарында тармактын SGD функциясын иштетип, андан кийин аны сыноо маалыматтары менен сынап көрүү.
Биздин киргизүү катмарларынын тизмеси үчүн 784 менен 10дун ортосундагы сандын эч кандай айырмасы жок экенин унутпаңыз. Биз башка катмарларды каалагандай өзгөртө алабыз; жөн гана киргизүү жана чыгаруу өлчөмдөрү белгиленген.
Үч катмар зарыл эмес; биз төрт, беш, ал тургай, экөөнү колдоно алабыз. Аны менен эксперимент кылуудан ырахат алыңыз.
жыйынтыктоо
Бул жерде, Python 3 колдонуп, биз нөлдөн баштап нейрон тармагын түзөбүз. Жогорку деңгээлдеги математика менен бирге биз ишке ашыруунун өзгөчөлүгүн да талкууладык.
Биз жардамчы функцияларды ишке ашыруу менен баштадык. Нейрондордун иштеши үчүн сигмоиддик жана сигмоиддик негизги функциялар өтө маанилүү. Андан кийин биз нейрондук тармакка маалыматтарды берүүнүн негизги процесси болуп саналган алдыга берүү функциясын ишке киргиздик.
Андан кийин, биз нейрон тармагыбызды башкарган кыймылдаткыч Pythonдо градиенттин түшүү функциясын түздүк. "Жергиликтүү минимумдарды" табуу жана алардын салмактарын жана кыйшаюуларын оптималдаштыруу үчүн биздин нейрон тармагы градиенттин түшүүсүн колдонот. Артка жайылтуу функциясын колдонуп түздүк градиенттүү түшүү.
Чыгуулар туура энбелгилерге дал келбеген учурда жаңыртууларды жеткирүү менен, бул функция нейрон тармагын "үйрөнүүгө" мүмкүндүк берет.
Акырында, биз жаңы Python'ду койдук нейрон тармак MNIST маалыматтар топтомун колдонуу менен тестке. Баары тегиз иштеди.
Коддошууңуз менен!
Таштап Жооп