Содржина[Крие][Прикажи]
Мозокот е споредлив со невронските мрежи. Ова е аналогијата што обично се користи за да му помогне на некој што е нов на темата да ги разбере идеите зад машинското учење и вештачките невронски мрежи.
Бидејќи постојат неколку слоеви на математички и статистички пресметки кои се одвиваат зад сцената, дефинирањето на овие мрежи како математичка функција е понапреден метод.
Ова е за луѓето кои всушност се заинтересирани за машинско учење и сакаат да видат како се пишува кодот на невронската мрежа на Пајтон.
Во оваа статија, ќе покажеме како да изградиме целосно поврзана длабока невронска мрежа (DNN) од почеток. Пајтон 3.
Преглед на структурата на датотеката за нашиот код за невронска мрежа Python
Тука ќе се креираат три датотеки. Првата е едноставната датотека nn.py, за која ќе се дискутира во „Поставување функции за помош“ и „Градење на невронската мрежа од нула“.
Ќе имаме и датотека со име mnist loader.py за вчитување на податоците од тестот, како што е опишано во „Вчитување на податоците од MNIST“.
Конечно, ќе имаме датотека со име test.py која ќе биде лансирана во терминалот за да ја тестира нашата невронска мрежа.
Оваа датотека е детално опишана во „Тестови за извршување“.
инсталација
Библиотеката NumPy Python мора да се преземе за да го следите ова упатство. Можете да го постигнете ова со користење на следнава команда на терминалот:
Увезување модули и поставување на функцијата Helper
Единствените две библиотеки што ни се потребни се случајни и NumPy, кои ќе ги увеземе веднаш. За првичните тежини на нашата нервна мрежа, ќе ги измешаме со помош на случајната библиотека.
За да ги забрзаме нашите пресметки, ќе користиме NumPy или np (по конвенција, често се увезува како np). Нашите две помошни функции ќе бидат направени по нашиот увоз. Две сигмоидни функции: една и сигмоиден прост.
Логистичката регресија ќе ги класифицира податоците користејќи ја сигмоидната функција, додека заднинското пропагирање ќе ја пресмета делтата или градиентот користејќи ја сигмоидна основна функција.
Креирање мрежна класа
Изградбата на целосно поврзана невронска мрежа е единствениот фокус на овој дел. Класата на мрежата ќе ги опфати сите функции што доаѓаат потоа. Функцијата Object() { [матичен код] } ќе се креира првично во нашата мрежна класа.
Еден аргумент, големини, е потребен од функцијата Object() { [матичен код] }. Променливата големини е збирка на нумерички вредности што го претставува бројот на влезни јазли присутни во секој слој на нашата невронска мрежа.
Ние иницијализираме четири својства во нашиот метод __init__. Влезните променливи, големини, се користат за поставување на списокот на големини на слоеви и бројот на слоеви, num слоеви, соодветно.
Првиот чекор е случајно да ги доделиме почетните пристрасност на нашата мрежа на секој слој што го следи влезниот слој.
Конечно, секоја врска помеѓу влезните и излезните слоеви има свои тежини генерирани по случаен избор. Np.Random.Randn() дава случаен примерок извлечен од нормалната дистрибуција за контекст.
Feed Forward функција
Во невронската мрежа, информациите се испраќаат нанапред преку функцијата за повлекување. Еден аргумент, a, кој го означува тековниот вектор за активирање, ќе биде потребен за оваа функција.
Оваа функција ги проценува активациите на секој слој со повторување на сите предрасуди и тежини во мрежата. Даден одговор е предвидувањето, а тоа е активирањето на последниот слој.
Спуштање на градиент на мини серија
Работниот коњ на нашата класа Network е Gradient Descent. Во оваа верзија, ние користиме мини-бач (стохастичко) спуштање со градиент, модифицирана варијација на спуштање на градиент.
Ова покажува дека мала група на точки за податоци ќе се користи за ажурирање на нашиот модел. Четири потребни и еден изборен аргумент се предадени на овој метод. Четирите потребни променливи се збирот на податоци за обука, бројот на епохи, големината на мини-серијата и стапката на учење (eta).
Податоците од тестот се достапни на барање. Ќе обезбедиме податоци од тестот кога на крајот ќе ја оцениме оваа мрежа. Бројот на примероци во оваа функција првично се поставува на должината на списокот откако податоците за обука ќе се трансформираат во тип на листа.
Истиот процес го применуваме и за тестирање на податоците што се дадени. Кога подоцна ќе ги вчитаме примероците на податоци на MNIST, ќе дознаеме повеќе за ова.
Ако можеме да се увериме дека ги обезбедуваме двата вида на податоци како списоци, тогаш овој тип-кастинг не е нужно суштински.
Откако ќе ги имаме податоците, ги поминуваме епохите за обука во јамка. Периодот за обука е само еден круг на обука за невронски мрежи. Прво ги мешаме податоците во секоја епоха за да обезбедиме случајност пред да направиме список на мини-серии.
Функцијата за мини серија за ажурирање, за која се дискутира подолу, ќе биде повикана за секоја мини-серија. Точноста на тестот исто така ќе биде вратена доколку се достапни податоците од тестот.
Помошна функција на дериват на трошоци
Ајде прво да развиеме помошна функција наречена извод на трошоци пред навистина да го создадеме кодот за заднинско ширење. Ако направиме грешка во нашиот излезен слој, тоа ќе го покаже функцијата дериват на трошоци.
Потребни се два влеза: низата за излезни активации и y-координати на очекуваните излезни вредности.
Функција за назад пропагирање
Нашиот сегашен вектор за активирање, активирање, како и сите други вектори за активирање, активации и z-вектори, zs, мора да се имаат на ум. Прво се активира слој наречен влезен слој.
Ќе ја разгледаме секоја пристрасност и тежина откако ќе ги поставиме. Секоја јамка вклучува пресметување на векторот z како производ на точки на тежините и активирањето, негово додавање на списокот со zs, повторно пресметување на активирањето и додавање на ажурираната активација на списокот со активирања.
Конечно, математиката. Делтата, која е еднаква на грешката од претходниот слој помножена со сигмоидниот прост на последниот елемент од векторите zs, се пресметува пред да го започнеме нашето назадување.
Последниот слој на nabla b е поставен да биде делта, а последниот слој на nabla w е поставен да биде производ со точки на делтата и вториот до последниот слој на активации (транспониран за да можеме всушност да направиме математика) .
Продолжуваме како и досега, почнувајќи од вториот слој и завршувајќи со последниот, и го повторуваме процесот откако ќе ги завршиме овие последни слоеви. Наблата потоа се враќаат како торка.
Се ажурира спуштање со градиент на мини серија
Нашиот метод SGD (стохастичко спуштање на градиент) од порано вклучува ажурирање на мини серија. Со оглед на тоа што се користи во SGD, но исто така бара и заднина, дебатирав каде да ја ставам оваа функција.
Конечно, решив да го објавам овде. Започнува со генерирање на 0 вектори на наблата на предрасудите и тежините, исто како што тоа го направи нашата функција за заднина.
Таа бара мини-серија и стапката на учење eta како негови два влеза. Во мини-серија, ние потоа ја користиме функцијата backprop за да ја добиеме делтата на секоја набла низа за секој влез, x и излез, y. Набла листите потоа се ажурираат со овие делти.
Конечно, ја користиме стапката на учење и nablas за да ги ажурираме тежините и предрасудите на мрежата. Секоја вредност се ажурира до најновата вредност, намалена за стапката на учење, помножена со големината на мини серија, а потоа се додава на вредноста на nabla.
Оценете ја функцијата
Функцијата за оценување е последната што треба да ја напишеме. Податоците од тестот се единствениот влез за оваа функција. Во оваа функција, ги споредуваме само излезите на мрежата со очекуваниот резултат, y. Со внесување на влезот, x, напред, се одредуваат излезите на мрежата.
Целосен код
Кога ќе го споиме целиот код, вака се појавува.
Тестирање на невронска мрежа
Се вчитуваат податоците на 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 невронска мрежа на тестот користејќи го множеството податоци MNIST. Сè функционираше непречено.
Среќно кодирање!
Оставете Одговор