Mundarija[Yashirish][Show]
Miyani neyron tarmoqlar bilan solishtirish mumkin. Bu o'xshashlik odatda mavzuga yangi kelgan odamga mashinani o'rganish va sun'iy neyron tarmoqlari ortidagi g'oyalarni tushunishga yordam berish uchun ishlatiladi.
Sahna ortida matematik va statistik hisob-kitoblarning bir necha qatlamlari borligi sababli, bu tarmoqlarni matematik funktsiya sifatida belgilash yanada ilg'or usuldir.
Bu aslida mashinani o'rganishga qiziqqan va Python neyron tarmog'i kodi qanday yozilganligini ko'rishni xohlaydigan odamlar uchun.
Ushbu maqolada biz to'liq ulangan chuqur neyron tarmog'ini (DNN) noldan qanday qurishni ko'rsatamiz. Python 3.
Python neyron tarmoq kodimiz uchun fayl tuzilishiga umumiy nuqtai
Bu yerda uchta fayl yaratiladi. Birinchisi oddiy nn.py fayli bo'lib, u "Yordamchi funktsiyalarni o'rnatish" va "Neyron tarmoqni noldan qurish" bo'limlarida muhokama qilinadi.
“MNIST maʼlumotlarini yuklash” boʻlimida taʼriflanganidek, test maʼlumotlarini yuklash uchun bizda mnist loader.py nomli fayl ham boʻladi.
Nihoyat, neyron tarmog'imizni sinab ko'rish uchun terminalda ishga tushiriladigan test.py nomli faylga ega bo'lamiz.
Ushbu fayl "Ishga tushirish testlari" da batafsil tavsiflangan.
o'rnatish
Ushbu qo'llanmani bajarish uchun NumPy Python kutubxonasi yuklab olinishi kerak. Buni terminalda quyidagi buyruq yordamida amalga oshirishingiz mumkin:
Modullarni import qilish va yordamchi funksiyani sozlash
Bizga kerak bo'lgan ikkita kutubxona tasodifiy va NumPy bo'lib, biz ularni darhol import qilamiz. Neyron tarmog'imizning dastlabki og'irliklari uchun biz ularni tasodifiy kutubxona yordamida aralashtiramiz.
Hisob-kitoblarimizni tezlashtirish uchun biz NumPy yoki np dan foydalanamiz (odatda u ko'pincha np sifatida import qilinadi). Bizning ikkita yordamchi funksiyamiz import qilinganidan keyin amalga oshiriladi. Ikki sigmasimon funktsiya: bitta va sigmasimon prime.
Logistik regressiya sigmasimon funktsiyadan foydalangan holda ma'lumotlarni tasniflaydi, orqaga tarqalish esa sigmasimon asosiy funksiya yordamida delta yoki gradientni hisoblab chiqadi.
Tarmoq sinfini yaratish
To'liq bog'langan neyron tarmog'ini yaratish - bu bo'limning yagona yo'nalishi. Tarmoq sinfi keyin keladigan barcha funktsiyalarni o'z ichiga oladi. Object() { [native code] } funksiyasi dastlab bizning tarmoq sinfimizda yaratiladi.
Object() { [mahalliy kod] } funktsiyasi uchun bitta argument, o'lchamlar talab qilinadi. O'lchamlar o'zgaruvchisi neyron tarmog'imizning har bir qatlamida mavjud bo'lgan kirish tugunlari sonini ifodalovchi raqamli qiymatlar to'plamidir.
Biz __init__ usulimizda to'rtta xususiyatni ishga tushiramiz. Kirish o'zgaruvchilari, o'lchamlari mos ravishda qatlam o'lchamlari ro'yxatini va qatlamlar sonini, son qatlamlarni o'rnatish uchun ishlatiladi.
Birinchi qadam, kirish qatlamidan keyingi har bir qatlamga bizning tarmog'imizning dastlabki moyilliklarini tasodifiy belgilashdir.
Nihoyat, kirish va chiqish qatlamlari o'rtasidagi har bir bog'lanish tasodifiy ravishda yaratilgan o'z vaznlariga ega. Np.Random.Randn() kontekst uchun oddiy taqsimotdan olingan tasodifiy namunani beradi.
Oldinga uzatish funksiyasi
Neyron tarmog'ida ma'lumot oldinga uzatish funktsiyasi orqali uzatiladi. Ushbu funktsiya uchun joriy faollashtirish vektorini ko'rsatadigan bitta argument, a talab qilinadi.
Ushbu funktsiya tarmoqdagi barcha moyillik va og'irliklarni takrorlash orqali har bir qatlamdagi faollashuvni baholaydi. Berilgan javob bashorat, ya'ni oxirgi qatlamning faollashuvi.
Mini-to'plamli gradient tushishi
Tarmoq sinfimiz uchun asosiy vosita bu Gradient Descent. Ushbu versiyada biz mini-to'plamli (stokastik) gradient tushishidan foydalanamiz, gradient tushishning o'zgartirilgan o'zgarishi.
Bu bizning modelimizni yangilash uchun ma'lumotlar nuqtalarining kichik partiyasi ishlatilishini ko'rsatadi. Ushbu usulga to'rtta zarur va bitta ixtiyoriy argument uzatiladi. To'rtta talab qilinadigan o'zgaruvchilar - bu o'quv ma'lumotlari to'plami, davrlar soni, kichik partiyalar hajmi va o'rganish tezligi (eta).
Sinov ma'lumotlari so'rov bo'yicha mavjud. Oxir-oqibat ushbu tarmoqni baholaganimizda sinov maʼlumotlarini taqdim etamiz. Ushbu funktsiyadagi namunalar soni o'quv ma'lumotlari ro'yxat turiga aylantirilgandan so'ng dastlab ro'yxat uzunligiga o'rnatiladi.
Biz berilgan ma'lumotlarni sinab ko'rish uchun ham xuddi shu jarayonni qo'llaymiz. Buning sababi, ular bizga ro'yxat sifatida qaytarilish o'rniga, ular haqiqatan ham ro'yxatlarning ziplaridir. MNIST ma'lumotlar namunalarini keyinroq yuklaganimizda, biz bu haqda ko'proq bilib olamiz.
Agar biz ikkala turdagi ma'lumotlarni ro'yxat sifatida taqdim etishimizga ishonch hosil qila olsak, bu turdagi translatsiya shart emas.
Ma'lumotlarga ega bo'lganimizdan so'ng, biz o'quv davrlarini tsiklda ko'rib chiqamiz. Trening davri - bu neyron tarmog'ini o'qitishning faqat bir bosqichi. Mini-to'plamlar ro'yxatini tuzishdan oldin tasodifiylikni ta'minlash uchun birinchi navbatda har bir davrda ma'lumotlarni aralashtiramiz.
Quyida muhokama qilinadigan mini-to'plamni yangilash funksiyasi har bir mini-to'plam uchun chaqiriladi. Sinov ma'lumotlari mavjud bo'lsa, test aniqligi ham qaytariladi.
Xarajat-hosila yordamchi funksiyasi
Haqiqatan ham orqaga tarqalish kodini yaratishdan oldin xarajat hosilasi deb nomlangan yordamchi funktsiyani ishlab chiqaylik. Agar biz chiqish qatlamimizda xatoga yo'l qo'ysak, uni tannarxning hosilaviy funktsiyasi ko'rsatadi.
Bu ikkita kirishni talab qiladi: chiqish faollashtirish massivi va kutilayotgan chiqish qiymatlarining y-koordinatalari.
Orqaga tarqalish funksiyasi
Bizning hozirgi faollashtirish vektorimiz, faollashtirish, shuningdek, boshqa har qanday faollashtirish vektorlari, faollashuvlar va z-vektorlari, zs, barchasini yodda tutish kerak. Avval kirish qatlami deb ataladigan qatlam faollashtiriladi.
Biz ularni o'rnatgandan so'ng, har bir egilish va vaznni ko'rib chiqamiz. Har bir tsikl z vektorini og'irliklar va faollashtirishning nuqta mahsuloti sifatida hisoblash, uni zs ro'yxatiga qo'shish, faollashtirishni qayta hisoblash va yangilangan faollashtirishni faollashtirishlar ro'yxatiga qo'shishni o'z ichiga oladi.
Nihoyat, matematika. Oldingi qatlamdan olingan xatoning zs vektorlarining oxirgi elementining sigmasimon tubiga ko'paytirilishiga teng bo'lgan delta biz orqaga o'tishimizni boshlashdan oldin hisoblanadi.
Nabla b ning oxirgi qatlami delta bo'lib o'rnatiladi va nabla w ning oxirgi qatlami deltaning nuqta mahsuloti va faollashtirishning ikkinchidan oxirgi qatlamiga o'rnatiladi (biz haqiqatda matematikani amalga oshirishimiz uchun ko'chiriladi) .
Biz avvalgidek davom etamiz, ikkinchi qatlamdan boshlaymiz va oxirgisi bilan yakunlaymiz va oxirgi qatlamlarni tugatgandan so'ng jarayonni takrorlaymiz. Keyin nablalar kortej sifatida qaytariladi.
Mini-to'plamli gradient tushishi yangilanmoqda
Bizning SGD (stokastik gradient descent) usulimiz mini-to'plamni yangilashni o'z ichiga oladi. U SGD-da qo'llanilganligi sababli, lekin ayni paytda backpropni talab qiladi, men bu funktsiyani qaerga qo'yishni muhokama qildim.
Nihoyat, men uni shu yerda joylashtirishga qaror qildim. U xuddi bizning backprop funksiyamiz singari, noaniqliklar va og'irliklar nablalarining 0 vektorini yaratishdan boshlanadi.
U ikkita kirish sifatida mini-to'plam va eta o'rganish tezligini talab qiladi. Mini-to'plamda biz har bir kirish, x va chiqish, y uchun har bir nabla massivining deltasini olish uchun backprop funktsiyasidan foydalanamiz. Nabla ro'yxatlari keyinchalik bu deltalar bilan yangilanadi.
Nihoyat, biz tarmoqning og'irliklari va tarafkashliklarini yangilash uchun o'rganish tezligi va nablalardan foydalanamiz. Har bir qiymat eng so'nggi qiymatga yangilanadi, o'rganish tezligi kamroq, minibatch hajmiga ko'paytiriladi va keyin nabla qiymatiga qo'shiladi.
Funktsiyani baholash
Baholash funktsiyasi biz yozishimiz kerak bo'lgan oxirgi funktsiyadir. Sinov ma'lumotlari ushbu funktsiya uchun yagona kirish hisoblanadi. Ushbu funktsiyada biz faqat tarmoq natijalarini kutilgan natija bilan solishtiramiz, y. Kirish, x, oldinga oziqlantirish orqali tarmoqning chiqishlari aniqlanadi.
Toʻliq kod
Barcha kodlarni birlashtirganimizda, u shunday ko'rinadi.
Neyron tarmog'ini sinovdan o'tkazish
MNIST maʼlumotlari yuklanmoqda
The MNIST ma'lumotlari .pkl.gz formatida bo‘lib, biz uni GZIP yordamida ochamiz va bodring bilan yuklaymiz. Keling, ushbu ma'lumotni trening, tekshirish va test ma'lumotlariga bo'lingan uchta o'lchamli kortej sifatida yuklashning tezkor usulini yozaylik.
Maʼlumotlarimizni boshqarishni osonlashtirish uchun y ni 10 elementli massivga kodlash uchun boshqa funksiya yozamiz. Tasvirning tegishli raqamiga mos keladigan 0dan tashqari massiv 1 dan iborat bo'ladi.
Maʼlumotlarimizni oʻqilishi mumkin boʻlgan formatga yuklash uchun asosiy yuk maʼlumotlari va bitta issiq kodlash usulidan foydalanamiz. Bizning x qiymatlarimizni tasvirning 784 pikseliga mos keladigan 784 o'lchamdagi ro'yxatga va bizning y qiymatlarimizni bitta issiq kodlangan vektor shakliga aylantiradigan boshqa funktsiya yoziladi.
Keyin x va y qiymatlarini bir indeks boshqasiga mos keladigan tarzda birlashtiramiz. Bu ta'lim, tekshirish va test ma'lumotlar to'plamiga taalluqlidir. Keyin o'zgartirilgan ma'lumotlarni qaytaramiz.
Ishlayotgan testlar
Biz “mnist loader” nomli yangi fayl yaratamiz, u sinovni boshlashdan oldin biz avval oʻrnatgan neyron tarmoqni (oddiy nn) va MNIST maʼlumotlar toʻplamini yuklovchini import qiladi.
Ushbu faylda biz qilishimiz kerak bo'lgan yagona narsa ma'lumotlarni import qilish, kirish qatlamining o'lchami 784 va chiqish qatlamining o'lchami 10 bo'lgan tarmoqni qurish, o'quv ma'lumotlarida tarmoqning SGD funksiyasini ishga tushirish, so'ngra uni test ma'lumotlari yordamida sinab ko'rishdir.
Yodda tutingki, kirish qatlamlari ro'yxati uchun 784 va 10 o'rtasidagi raqamlar qanday bo'lishi farq qilmaydi. Boshqa qatlamlarni o'zimiz xohlagan tarzda o'zgartirishimiz mumkin; faqat kirish va chiqish o'lchamlari belgilangan.
Uchta qatlam kerak emas; biz to'rt, besh yoki hatto ikkitasini ishlatishimiz mumkin. U bilan tajriba qilishdan zavqlaning.
Xulosa
Bu erda, Python 3 dan foydalanib, biz noldan neyron tarmoq yaratamiz. Yuqori darajadagi matematika bilan bir qatorda, biz amalga oshirishning o'ziga xos xususiyatlarini ham muhokama qildik.
Biz yordamchi funktsiyalarni amalga oshirishdan boshladik. Neyronlarning ishlashi uchun sigmasimon va sigmasimon asosiy funktsiyalar juda muhimdir. Keyin biz neyron tarmoqqa ma'lumotlarni uzatishning asosiy jarayoni bo'lgan oldinga uzatish funktsiyasini amalda qo'llaymiz.
Keyinchalik, biz neyron tarmog'imizni boshqaradigan vosita Python-da gradient tushish funksiyasini yaratdik. "Mahalliy minimal" ni aniqlash va ularning og'irliklari va moyilliklarini optimallashtirish uchun bizning neyron tarmog'imiz gradient tushishidan foydalanadi. Biz orqaga tarqalish funksiyasini yaratdik gradient tushish.
Chiqishlar tegishli teglarga mos kelmasa, yangilanishlarni yetkazib berish orqali bu funksiya neyron tarmoqqa “o‘rganish” imkonini beradi.
Va nihoyat, biz yangi Python-ni joylashtirdik neyron tarmoq MNIST ma'lumotlar to'plamidan foydalangan holda testga. Hammasi muammosiz ishladi.
Baxtli kodlash!
Leave a Reply