Мазмұны[Жасыру][Көрсету]
Миды нейрондық желілермен салыстыруға болады. Бұл әдетте пәнге жаңадан келген адамға машиналық оқыту мен жасанды нейрондық желілердің идеяларын түсінуге көмектесу үшін қолданылатын ұқсастық.
Сахналардың артында математикалық және статистикалық есептеулердің бірнеше қабаттары бар болғандықтан, бұл желілерді математикалық функция ретінде анықтау жетілдірілген әдіс болып табылады.
Бұл шын мәнінде машиналық оқытуға қызығушылық танытатын және Python нейрондық желі коды қалай жазылғанын көргісі келетін адамдарға арналған.
Бұл мақалада біз нөлден бастап толығымен қосылған терең нейрондық желіні (DNN) қалай құру керектігін көрсетеміз. Python 3.
Біздің Python нейрондық желі кодының файл құрылымына шолу
Мұнда үш файл жасалады. Біріншісі - қарапайым nn.py файлы, ол «Анықтамалық функцияларды орнату» және «Нөлден нейрондық желіні құру» бөлімдерінде талқыланады.
Сондай-ақ бізде «MNIST деректерін жүктеу» бөлімінде сипатталғандай сынақ деректерін жүктеу үшін mnist loader.py деп аталатын файл болады.
Соңында, нейрондық желімізді тексеру үшін терминалда іске қосылатын test.py атты файлымыз болады.
Бұл файл «Орындалу сынақтары» бөлімінде егжей-тегжейлі сипатталған.
Орнату
Осы оқулықты орындау үшін NumPy Python кітапханасын жүктеп алу керек. Мұны терминалда келесі пәрменді пайдалану арқылы орындауға болады:
Модульдерді импорттау және Helper функциясын орнату
Бізге қажет екі ғана кітапхана - кездейсоқ және NumPy, біз оларды бірден импорттаймыз. Нейрондық желінің бастапқы салмақтары үшін біз оларды кездейсоқ кітапхана арқылы араластырамыз.
Есептеулерді жылдамдату үшін біз NumPy немесе np қолданамыз (конвенция бойынша ол көбінесе np ретінде импортталады). Біздің екі көмекші функция импорттан кейін жасалады. Екі сигма тәрізді функция: бір және сигма тәрізді негізгі.
Логистикалық регрессия сигма тәрізді функцияны пайдаланып деректерді жіктейді, ал кері таралу сигма тәрізді негізгі функциясы арқылы дельтаны немесе градиентті есептейді.
Желі класын құру
Толық байланыстырылған нейрондық желіні құру - бұл бөлімнің жалғыз бағыты. Желі класы кейін келетін барлық функцияларды қамтиды. Object() { [жергілікті код] } функциясы бастапқыда біздің желі сыныбында жасалады.
Object() { [жергілікті код] } функциясы үшін бір аргумент, өлшемдер қажет. Өлшемдер айнымалысы - бұл нейрондық желінің әрбір қабатында бар енгізу түйіндерінің санын көрсететін сандық мәндердің жинағы.
Біз __init__ әдісімізде төрт сипатты инициализациялаймыз. Енгізілетін айнымалылар, өлшемдер, сәйкесінше қабат өлшемдерінің тізімін және қабаттар санын, сандық қабаттарды орнату үшін пайдаланылады.
Бірінші қадам - кіріс деңгейінен кейінгі әрбір қабатқа желіміздің бастапқы ауытқуларын кездейсоқ тағайындау.
Соңында, кіріс және шығыс қабаттары арасындағы әрбір сілтеме кездейсоқ түрде құрылған салмақтарға ие. Np.Random.Randn() мәтінмән үшін қалыпты үлестірімнен алынған кездейсоқ таңдауды береді.
Алға жіберу функциясы
Нейрондық желіде ақпарат алға жіберу функциясы арқылы жіберіледі. Ағымдағы белсендіру векторын көрсететін бір аргумент, а бұл функция үшін қажет болады.
Бұл функция желідегі барлық ауытқулар мен салмақтарды қайталау арқылы әрбір қабаттағы белсендірулерді бағалайды. Берілген жауап – болжам, яғни соңғы қабаттың белсендіруі.
Шағын топтама Градиентті түсіру
Біздің желілік сыныптың жұмыс күші - градиентті түсіру. Бұл нұсқада біз шағын топтаманы (стохастикалық) градиентті түсіруді, градиент түсуінің өзгертілген нұсқасын қолданамыз.
Бұл үлгіні жаңарту үшін деректер нүктелерінің шағын партиясы пайдаланылатынын көрсетеді. Бұл әдіске төрт міндетті және бір қосымша аргумент жіберіледі. Төрт талап етілетін айнымалылар оқу деректер жинағы, дәуірлер саны, шағын топтамалардың өлшемі және оқу жылдамдығы (эта).
Сынақ деректері сұраныс бойынша қол жетімді. Ақыр соңында осы желіні бағалағанда сынақ деректерін береміз. Бұл функциядағы үлгілер саны бастапқыда оқу деректері тізім түріне түрлендіруден кейін тізім ұзындығына орнатылады.
Біз сондай-ақ берілген деректерді сынау үшін бірдей процесті қолданамыз. Себебі олар бізге тізім ретінде қайтарудың орнына, шын мәнінде тізімдердің zip болып табылады. MNIST деректер үлгілерін кейінірек жүктегенде, біз бұл туралы көбірек білеміз.
Егер біз деректердің екі түрін де тізім ретінде беретінімізге көз жеткізе алсақ, онда бұл типті трансляциялау міндетті түрде маңызды емес.
Деректерді алғаннан кейін біз циклде оқыту дәуірлерін аралаймыз. Жаттығу кезеңі нейрондық желіні оқытудың бір кезеңі ғана. Шағын топтамалардың тізімін жасамас бұрын кездейсоқтықтың болуын қамтамасыз ету үшін алдымен әрбір дәуірдегі деректерді араластырамыз.
Төменде талқыланатын шағын топтаманы жаңарту функциясы әрбір шағын топтама үшін шақырылады. Сынақ деректері қол жетімді болса, сынақ дәлдігі де қайтарылады.
Шығын-туынды көмекші функциясы
Кері таралу кодын шынымен жасамас бұрын, алдымен шығын туындысы деп аталатын көмекші функцияны әзірлейік. Егер біз шығыс қабатымызда қателессек, оны шығынның туынды функциясы көрсетеді.
Ол екі кірісті қажет етеді: шығыс белсендіру массиві және күтілетін шығыс мәндерінің y координаттары.
Кері таралу функциясы
Біздің қазіргі активтендіру векторын, белсендіруді, сондай-ақ кез келген басқа белсендіру векторларын, белсендірулерді және z-векторларды, zs, барлығын есте сақтау керек. Алдымен кіріс қабаты деп аталатын қабат іске қосылады.
Біз оларды орнатқаннан кейін әрбір қиғаштық пен салмақты айналдырамыз. Әрбір цикл салмақтар мен белсендірудің нүктелік туындысы ретінде z векторын есептеуді, оны zs тізіміне қосуды, белсендіруді қайта есептеуді және белсендіру тізіміне жаңартылған белсендіруді қосуды қамтиды.
Ақырында, математика. zs векторларының соңғы элементінің сигма тәрізді жай санына көбейтілген алдыңғы қабаттағы қатеге тең дельта кері өтуді бастамас бұрын есептеледі.
nabla b соңғы қабаты дельта болып орнатылды, ал nabla w соңғы қабаты дельтаның нүктелік туындысы және белсендірулердің екіншіден соңғы қабатына дейін орнатылады (есепті нақты жасай алатындай етіп ауыстырылды) .
Біз бұрынғыдай әрекет етеміз, екінші қабаттан бастап, соңғысын аяқтаймыз және осы соңғы қабаттарды аяқтағаннан кейін процесті қайталаймыз. Содан кейін наблалар кортеж ретінде қайтарылады.
Шағын топтаманың градиент түсуін жаңарту
Біздің SGD (стохастикалық градиентті түсіру) әдісіміз шағын топтаманы жаңартуды қамтиды. Ол SGD-де қолданылғандықтан, бірақ сонымен қатар тіректерді қажет ететіндіктен, мен бұл функцияны қайда қою керектігін талқыладым.
Ақырында мен оны осында жариялауды жөн көрдім. Ол біздің backprop функциясы сияқты қиғаштықтардың және салмақтардың наблаларының 0 векторын генерациялаудан басталады.
Ол екі кіріс ретінде шағын топтаманы және оқу жылдамдығын талап етеді. Шағын топтамада біз әрбір кіріс, x және шығыс, y үшін әрбір nabla массивінің дельтасын алу үшін backprop функциясын қолданамыз. Содан кейін nabla тізімдері осы дельталармен жаңартылады.
Соңында, желінің салмақтары мен бұрмалануларын жаңарту үшін оқу жылдамдығы мен наблаларды қолданамыз. Әрбір мән ең соңғы мәнге жаңартылады, үйрену жылдамдығын шегеріп, шағын топтама өлшеміне көбейтіледі, содан кейін nabla мәніне қосылады.
Функцияны бағалау
Бағалау функциясы - біз жазуымыз керек соңғы функция. Сынақ деректері бұл функция үшін жалғыз кіріс болып табылады. Бұл функцияда біз тек желінің шығыстарын күтілетін нәтижемен салыстырамыз, y. Кіріс, х, алға беру арқылы желінің шығыстары анықталады.
Толық код
Біз барлық кодты біріктірген кезде, ол осылай көрінеді.
Нейрондық желіні сынау
MNIST деректері жүктелуде
The MNIST деректері .pkl.gz пішімінде, біз оны GZIP арқылы ашамыз және тұздықпен жүктейміз. Бұл деректерді оқыту, тексеру және сынақ деректеріне бөлінген үш өлшемді кортеж ретінде жүктеудің жылдам әдісін жазайық.
Деректерімізді басқаруды жеңілдету үшін y-ді 10 элементтік массивке кодтау үшін басқа функцияны жазамыз. Кескіннің тиісті цифрына сәйкес келетін 0-ден басқа массив 1-ден тұрады.
Деректерді оқылатын пішімге жүктеу үшін негізгі жүктеу деректерін және бір ыстық кодтау әдісін қолданамыз. Басқа функция жазылады, ол біздің x мәндерін кескіннің 784 пикселіне сәйкес келетін 784 өлшемді тізімге және біздің y мәндерімізді олардың бір ыстық кодталған векторлық пішініне түрлендіреді.
Содан кейін біз x және y мәндерін бір индекс екіншісіне сәйкес келетін етіп біріктіреміз. Бұл оқыту, тексеру және сынақ деректер жиындарына қатысты. Содан кейін өзгертілген деректерді қайтарамыз.
Орындалатын сынақтар
Біз тестілеуді бастамас бұрын бұрын орнатқан нейрондық желіні (қарапайым nn) және MNIST деректер жинағын жүктегішті импорттайтын «mnist жүктеуші» деп аталатын жаңа файлды жасаймыз.
Бұл файлда бізге тек деректерді импорттау, кіріс деңгейі 784 және шығыс деңгейі 10 болатын желіні құру, оқыту деректерінде желінің SGD функциясын іске қосу, содан кейін оны сынақ деректері арқылы тексеру қажет.
Енгізу қабаттарының тізімі үшін 784 пен 10 арасындағы кез келген санның айырмашылығы жоқ екенін есте сақтаңыз. Біз басқа қабаттарды кез келген жолмен өзгерте аламыз; тек кіріс және шығыс өлшемдері бекітілген.
Үш қабат қажет емес; біз төрт, бес немесе тіпті екеуін пайдалана аламыз. Онымен тәжірибе жасап, рахат алыңыз.
қорытынды
Мұнда Python 3 көмегімен нейрондық желіні нөлден жасаймыз. Жоғары деңгейлі математикамен қатар жүзеге асыру ерекшеліктерін де талқыладық.
Біз көмекші функцияларды іске асырудан бастадық. Нейрондардың жұмыс істеуі үшін сигма тәрізді және сигма тәрізді негізгі функциялар өте маңызды. Содан кейін біз нейрондық желіге деректерді берудің негізгі процесі болып табылатын алға жіберу функциясын қолданамыз.
Содан кейін біз нейрондық желіні басқаратын қозғалтқыш Python-да градиентті түсіру функциясын жасадық. «Жергілікті минимумдарды» табу және олардың салмақтары мен қиғаштықтарын оңтайландыру үшін біздің нейрондық желіміз градиентті түсіруді пайдаланады. көмегімен кері таралу функциясын жасадық градиенттің түсуі.
Шығыстар тиісті белгілерге сәйкес келмеген кезде жаңартуларды жеткізу арқылы бұл функция нейрондық желіге «үйренуге» мүмкіндік береді.
Соңында біз жаңа Python-ды қойдық нейрондық желі MNIST деректер жинағын пайдаланып сынаққа. Барлығы қалыпты жұмыс істеді.
Кодтау құтты болсын!
пікір қалдыру