Mündəricat[Gizlət][Göstər]
Beyin neyron şəbəkələri ilə müqayisə edilə bilər. Bu, adətən mövzuya yeni başlayan birinə maşın öyrənməsi və süni neyron şəbəkələrinin arxasında duran ideyaları başa düşməyə kömək etmək üçün istifadə edilən bənzətmədir.
Pərdə arxasında gedən bir neçə təbəqəli riyazi və statistik hesablamalar olduğundan, bu şəbəkələri riyazi funksiya kimi təyin etmək daha təkmil bir üsuldur.
Bu, həqiqətən maşın öyrənməsi ilə maraqlanan və Python neyron şəbəkə kodunun necə yazıldığını görmək istəyən insanlar üçündür.
Bu yazıda biz sıfırdan tam əlaqəli dərin neyron şəbəkəsinin (DNN) necə qurulacağını nümayiş etdirəcəyik. Python 3.
Python Neyron Şəbəkə Kodumuz üçün Fayl Strukturuna Baxış
Burada üç fayl yaradılacaq. Birincisi sadə nn.py faylıdır, bu fayl “Köməkçi funksiyaların qurulması” və “Sıfırdan Neyron Şəbəkəsinin qurulması” bölmələrində müzakirə olunacaq.
“MNIST Datanın yüklənməsi” bölməsində təsvir olunduğu kimi test məlumatlarını yükləmək üçün mnist loader.py adlı faylımız da olacaq.
Nəhayət, neyron şəbəkəmizi yoxlamaq üçün terminalda işə salınacaq test.py adlı faylımız olacaq.
Bu fayl "İşləyən Testlər" bölməsində ətraflı təsvir edilmişdir.
quraşdırma
Bu təlimatı izləmək üçün NumPy Python kitabxanası yüklənməlidir. Bunu terminalda aşağıdakı əmrdən istifadə edərək edə bilərsiniz:
Modulların idxalı və Helper funksiyasının qurulması
Tələb etdiyimiz yalnız iki kitabxana təsadüfi və dərhal idxal edəcəyimiz NumPy-dir. Neyron şəbəkəmizin ilkin çəkiləri üçün biz onları təsadüfi kitabxanadan istifadə edərək qarışdıracağıq.
Hesablamalarımızı sürətləndirmək üçün biz NumPy və ya np-dən istifadə edəcəyik (konvensiyaya görə, o, çox vaxt np kimi idxal olunur). Bizim iki köməkçi funksiyamız idxaldan sonra ediləcək. İki sigmoid funksiyası: bir və sigmoid prime.
Logistik reqressiya sigmoid funksiyasından istifadə edərək məlumatları təsnif edəcək, geri yayılma isə sigmoid əsas funksiyasından istifadə edərək delta və ya qradienti hesablayacaq.
Şəbəkə sinfinin yaradılması
Tam əlaqəli neyron şəbəkəsinin qurulması bu bölmənin yeganə diqqət mərkəzindədir. Şəbəkə sinfi bundan sonra gələn bütün funksiyaları əhatə edəcəkdir. Object() { [doğma kod] } funksiyası ilkin olaraq şəbəkə sinifimizdə yaradılacaq.
Object() { [doğma kod] } funksiyası üçün bir arqument, ölçülər tələb olunur. Ölçülər dəyişəni neyron şəbəkəmizin hər qatında mövcud olan giriş qovşaqlarının sayını əks etdirən rəqəmli dəyərlər toplusudur.
__init__ metodumuzda dörd xüsusiyyəti işə salırıq. Giriş dəyişənləri, ölçülər, müvafiq olaraq təbəqə ölçülərinin siyahısını və təbəqələrin sayını, layların sayını təyin etmək üçün istifadə olunur.
İlk addım təsadüfi olaraq şəbəkəmizin ilkin meyllərini giriş qatını izləyən hər bir təbəqəyə təyin etməkdir.
Nəhayət, giriş və çıxış təbəqələri arasındakı hər bir əlaqənin təsadüfi olaraq yaradılan çəkiləri var. Np.Random.Randn() kontekst üçün normal paylanmadan seçilmiş təsadüfi nümunə verir.
İrəli Feed Funksiyası
Neyroşəbəkələrdə məlumat ötürmə funksiyası ilə ötürülür. Bu funksiya üçün cari aktivləşdirmə vektorunu göstərən bir arqument, a tələb olunacaq.
Bu funksiya şəbəkədəki bütün meyllər və çəkilər üzərində təkrarlamaqla hər bir təbəqədə aktivləşdirmələri təxmin edir. Verilən cavab son təbəqənin aktivləşdirilməsi olan proqnozdur.
Mini-toplu Gradient Eniş
Şəbəkə sinifimizin əsas qüvvəsi Qradient Enişdir. Bu versiyada biz gradient enişinin dəyişdirilmiş variasiyası olan mini-toplu (stoxastik) gradient enişindən istifadə edirik.
Bu, modelimizi yeniləmək üçün kiçik bir məlumat nöqtəsinin istifadə olunacağını göstərir. Bu metoda dörd tələb olunan və bir isteğe bağlı arqument ötürülür. Dörd tələb olunan dəyişənlər təlim məlumat dəsti, dövrlərin sayı, mini dəstələrin ölçüsü və öyrənmə dərəcəsidir (eta).
Test məlumatları sorğu əsasında mövcuddur. Bu şəbəkəni nəhayət qiymətləndirdiyimiz zaman test məlumatlarını təqdim edəcəyik. Təlim məlumatları siyahı növünə çevrildikdən sonra bu funksiyadakı nümunələrin sayı ilkin olaraq siyahının uzunluğuna təyin edilir.
Verilən məlumatları test etmək üçün də eyni prosesi tətbiq edirik. Bunun səbəbi siyahı kimi bizə qaytarılmaq əvəzinə, onların həqiqətən siyahıların zipləri olmasıdır. MNIST məlumat nümunələrini daha sonra yüklədikdə, bu barədə daha çox öyrənəcəyik.
Hər iki növ məlumatı siyahılar kimi təqdim etdiyimizə əmin ola bilsək, bu tip-casting mütləq vacib deyil.
Verilənlərə sahib olduqdan sonra biz dövrədə təlim dövrlərini keçirik. Təlim müddəti neyron şəbəkə təliminin yalnız bir mərhələsidir. Mini qrupların siyahısını tərtib etməzdən əvvəl təsadüfiliyi təmin etmək üçün əvvəlcə hər bir dövrdə məlumatları qarışdırırıq.
Aşağıda müzakirə olunan yeniləmə mini toplu funksiyası hər bir mini dəstə üçün çağırılacaq. Test məlumatları mövcud olduqda test dəqiqliyi də qaytarılacaq.
Xərc-törəmə köməkçi funksiyası
Həqiqətən geri yayılma kodunu yaratmazdan əvvəl əvvəlcə xərc törəməsi adlı köməkçi funksiyanı inkişaf etdirək. Çıxış qatımızda səhv etsək, məsrəf törəmə funksiyası bunu göstərəcək.
Bunun üçün iki giriş tələb olunur: çıxış aktivləşdirmə massivi və gözlənilən çıxış dəyərlərinin y koordinatları.
Geri yayılma funksiyası
Hazırkı aktivləşdirmə vektorumuz, aktivləşdirmə, eləcə də hər hansı digər aktivləşdirmə vektorları, aktivləşdirmələr və z-vektorları, zs, hamısı yadda saxlanmalıdır. Əvvəlcə giriş qatı adlanan təbəqə aktivləşdirilir.
Onları qoyduqdan sonra hər bir meyl və çəki ilə dönəcəyik. Hər bir dövrə çəkilərin və aktivləşdirmənin nöqtə məhsulu kimi z vektorunun hesablanmasını, onun zs siyahısına əlavə edilməsini, aktivləşdirmənin yenidən hesablanmasını və aktivləşdirmə siyahısına yenilənmiş aktivləşdirmənin əlavə edilməsini əhatə edir.
Nəhayət, riyaziyyat. Əvvəlki təbəqədən alınan xətanın zs vektorlarının sonuncu elementinin sigmoid əsasına vurulmasına bərabər olan delta, geriyə keçidimizə başlamazdan əvvəl hesablanır.
Nabla b-nin son təbəqəsi delta, nabla w-nin son qatı isə deltanın nöqtə məhsulu və aktivləşdirmələrin ikinci-axır qatı olacaq (biz faktiki olaraq riyaziyyatı edə bildiyimiz üçün köçürülüb) .
İkinci qatdan başlayaraq sonuncu ilə yekunlaşaraq əvvəlki kimi davam edirik və bu sonuncu təbəqələri tamamladıqdan sonra prosesi təkrarlayırıq. Sonra nablalar bir dəst kimi geri verilir.
Mini-toplu gradient enişi yenilənir
Əvvəlki SGD (stokastik gradient eniş) metodumuz mini-toplu yeniləməni özündə birləşdirir. SGD-də istifadə edildiyi, həm də arxa dayaq tələb etdiyi üçün bu funksiyanı hara qoyacağımı müzakirə etdim.
Nəhayət, onu burada yerləşdirmək qərarına gəldim. O, bizim backprop funksiyamız kimi, qərəzlərin və çəkilərin nablalarının 0 vektorunu yaratmaqla başlayır.
Onun iki girişi kimi mini-batch və eta öyrənmə sürətini tələb edir. Mini-toplamada biz hər bir giriş, x və çıxış, y üçün hər bir nabla massivinin deltasını əldə etmək üçün backprop funksiyasından istifadə edirik. Nabla siyahıları daha sonra bu deltalarla yenilənir.
Nəhayət, şəbəkənin çəkilərini və qərəzlərini yeniləmək üçün öyrənmə sürətindən və nablalardan istifadə edirik. Hər bir dəyər ən son dəyərə yenilənir, öyrənmə dərəcəsi çıxılmaqla, minibatch ölçüsünə vurulur və sonra nabla dəyərinə əlavə edilir.
Funksiyanı qiymətləndirin
Qiymətləndirmə funksiyası yazmağımız lazım olan son funksiyadır. Test məlumatları bu funksiya üçün yeganə girişdir. Bu funksiyada biz yalnız şəbəkənin çıxışlarını gözlənilən nəticə ilə müqayisə edirik, y. Giriş, x, irəli qidalanaraq, şəbəkənin çıxışları müəyyən edilir.
Kodu tamamlayın
Bütün kodu birləşdirdikdə belə görünür.
Sinir şəbəkəsinin sınaqdan keçirilməsi
MNIST məlumatları yüklənir
The MNIST məlumatları .pkl.gz formatındadır, biz onu GZIP istifadə edərək açacağıq və turşu ilə yükləyəcəyik. Gəlin bu məlumatları təlim, doğrulama və sınaq məlumatlarına bölünmüş üç ölçülü bir dəst kimi yükləmək üçün sürətli bir üsul yazaq.
Məlumatlarımızı idarə etməyi asanlaşdırmaq üçün y-ni 10 elementli massivdə kodlaşdırmaq üçün başqa bir funksiya yazacağıq. Massiv şəklin müvafiq rəqəminə uyğun gələn 0 istisna olmaqla, hamısı 1 olacaq.
Məlumatlarımızı oxuna bilən formata yükləmək üçün əsas yükləmə məlumatından və bir qaynar kodlaşdırma metodundan istifadə edəcəyik. Başqa bir funksiya yazılacaq ki, bizim x dəyərlərimizi şəklin 784 pikselinə uyğun gələn 784 ölçülü bir siyahıya, y dəyərlərimiz isə tək isti kodlanmış vektor formasına çevirəcək.
Sonra x və y dəyərlərini elə birləşdirəcəyik ki, bir indeks digərinə uyğun olsun. Bu, təlim, yoxlama və test məlumat dəstlərinə aiddir. Sonra dəyişdirilmiş məlumatları qaytarırıq.
Çalışan Testlər
Testə başlamazdan əvvəl həm əvvəllər qurduğumuz neyron şəbəkəni (sadə nn) və həm də MNIST məlumat dəsti yükləyicisini idxal edəcək “mnist yükləyici” adlı yeni fayl yaradacağıq.
Bu faylda bizə lazım olan tək şey məlumatları idxal etmək, giriş qatının ölçüsü 784 və çıxış qatının ölçüsü 10 olan şəbəkə qurmaq, təlim məlumatlarında şəbəkənin SGD funksiyasını işə salmaq və sonra test məlumatlarından istifadə edərək onu sınaqdan keçirməkdir.
Nəzərə alın ki, bizim giriş təbəqələri siyahısı üçün 784 və 10 arasında olan rəqəmlərin heç bir fərqi yoxdur. Biz digər təbəqələri istədiyimiz şəkildə dəyişə bilərik; yalnız giriş və çıxış ölçüləri sabitdir.
Üç qat lazım deyil; dörd, beş və ya hətta ikisini istifadə edə bilərik. Bununla sınaqdan əylənin.
Nəticə
Burada Python 3-dən istifadə edərək sıfırdan neyron şəbəkəsi yaradırıq. Yüksək səviyyəli riyaziyyatla yanaşı, həyata keçirilməsinin xüsusiyyətlərini də müzakirə etdik.
Biz köməkçi funksiyaları həyata keçirməklə başladıq. Neyronların işləməsi üçün sigmoid və sigmoid əsas funksiyaları çox vacibdir. Daha sonra neyron şəbəkəsinə verilənlərin ötürülməsi üçün əsas proses olan irəli ötürülmə funksiyasını tətbiq etdik.
Sonra, neyron şəbəkəmizi idarə edən mühərrik olan Python-da gradient eniş funksiyasını yaratdıq. “Yerli minimumları” tapmaq və onların çəkilərini və meyllərini optimallaşdırmaq üçün neyron şəbəkəmiz gradient enişindən istifadə edir. istifadə edərək geri yayılma funksiyasını yaratdıq gradient eniş.
Çıxışlar müvafiq etiketlərə uyğun gəlmədikdə yeniləmələri çatdırmaqla bu funksiya neyron şəbəkəyə “öyrənməyə” imkan verir.
Nəhayət, yeni Pythonumuzu qoyduq neyron şəbəkə MNIST məlumat dəstindən istifadə edərək test üçün. Hər şey səliqəli işləyir.
Xoşbəxt kodlaşdırma!
Cavab yaz