სარჩევი[დამალვა][ჩვენება]
ტვინი შედარებულია ნერვულ ქსელებთან. ეს არის ანალოგია, რომელიც, როგორც წესი, გამოიყენება იმისთვის, რომ დაეხმარონ ახალ ადამიანს, გაიგოს იდეები მანქანური სწავლისა და ხელოვნური ნერვული ქსელების მიღმა.
იმის გამო, რომ მათემატიკური და სტატისტიკური გამოთვლების რამდენიმე ფენა მიმდინარეობს კულისებში, ამ ქსელების მათემატიკური ფუნქციის განსაზღვრა უფრო მოწინავე მეთოდია.
ეს არის მათთვის, ვინც რეალურად დაინტერესებულია მანქანათმცოდნეობით და სურთ ნახონ, როგორ იწერება პითონის ნერვული ქსელის კოდი.
ამ სტატიაში ჩვენ გაჩვენებთ, თუ როგორ უნდა ავაშენოთ სრულად დაკავშირებული ღრმა ნერვული ქსელი (DNN) ნულიდან. Python 3.
ჩვენი პითონის ნერვული ქსელის კოდის ფაილის სტრუქტურის მიმოხილვა
აქ შეიქმნება სამი ფაილი. პირველი არის მარტივი nn.py ფაილი, რომელიც იქნება განხილული "დამხმარე ფუნქციების დაყენება" და "ნერვული ქსელის აშენება ნულიდან".
ჩვენ ასევე გვექნება ფაილი სახელად mnist loader.py ტესტის მონაცემების ჩასატვირთად, როგორც ეს აღწერილია „MNIST მონაცემთა ჩატვირთვაში“.
დაბოლოს, ჩვენ გვექნება ფაილი სახელად test.py, რომელიც გაშვებული იქნება ტერმინალში ჩვენი ნერვული ქსელის შესამოწმებლად.
ეს ფაილი დეტალურად არის აღწერილი „გაშვებული ტესტებში“.
მონტაჟი
NumPy Python ბიბლიოთეკა უნდა იყოს გადმოწერილი, რათა მიჰყვეთ ამ სახელმძღვანელოს. ამის გაკეთება შეგიძლიათ ტერმინალზე შემდეგი ბრძანების გამოყენებით:
მოდულების იმპორტი და დამხმარე ფუნქციის დაყენება
ჩვენ მხოლოდ ორი ბიბლიოთეკა გვჭირდება არის შემთხვევითი და NumPy, რომლებსაც ჩვენ დაუყოვნებლივ შემოვიტანთ. ჩვენი ნერვული ქსელის საწყისი წონებისთვის, ჩვენ მათ შევურევთ შემთხვევითი ბიბლიოთეკის გამოყენებით.
ჩვენი გამოთვლების დასაჩქარებლად, ჩვენ გამოვიყენებთ NumPy ან np (კონვენციით, ის ხშირად იმპორტირებულია როგორც np). ჩვენი ორი დამხმარე ფუნქცია განხორციელდება ჩვენი იმპორტის შემდეგ. ორი სიგმოიდური ფუნქცია: ერთი და სიგმოიდური პირველი.
ლოგისტიკური რეგრესია დაახარისხებს მონაცემებს სიგმოიდური ფუნქციის გამოყენებით, ხოლო უკანა გავრცელება გამოთვლის დელტას ან გრადიენტს სიგმოიდური პირველი ფუნქციის გამოყენებით.
ქსელის კლასის შექმნა
სრულად დაკავშირებული ნერვული ქსელის შექმნა ამ განყოფილების ერთადერთი აქცენტია. ქსელის კლასი მოიცავს ყველა ფუნქციას, რომელიც მოჰყვება. ფუნქცია Object() { [მშობლიური კოდი] } შეიქმნება თავდაპირველად ჩვენს ქსელის კლასში.
ერთი არგუმენტი, ზომები, საჭიროა ფუნქცია Object() { [მშობლიური კოდი] }. ზომის ცვლადი არის რიცხვითი მნიშვნელობების კრებული, რომელიც წარმოადგენს ჩვენი ნერვული ქსელის თითოეულ ფენაში არსებული შეყვანის კვანძების რაოდენობას.
ჩვენ ვაყენებთ ოთხ თვისებას ჩვენს __init__ მეთოდში. შეყვანის ცვლადები, ზომები, გამოიყენება ფენების ზომის სიის დასაყენებლად და ფენების რაოდენობის, ფენების რაოდენობა, შესაბამისად.
პირველი ნაბიჯი არის ჩვენი ქსელის საწყისი მიკერძოების შემთხვევითი მინიჭება თითოეულ ფენას, რომელიც მიჰყვება შეყვანის ფენას.
და ბოლოს, თითოეულ ბმულს შეყვანის და გამომავალი ფენებს შორის აქვს თავისი წონა შემთხვევით გენერირებული. Np.Random.Randn() იძლევა შემთხვევით ნიმუშს, რომელიც აღებულია კონტექსტის ნორმალური განაწილებიდან.
Feed Forward ფუნქცია
ნერვულ ქსელში ინფორმაცია იგზავნება წინ მიმავალი ფუნქციით. ერთი არგუმენტი, a, რომელიც მიუთითებს მიმდინარე აქტივაციის ვექტორზე, საჭირო იქნება ამ ფუნქციისთვის.
ეს ფუნქცია აფასებს აქტივაციას თითოეულ ფენაში ქსელში არსებული ყველა მიკერძოებისა და წონის გამეორებით. პასუხი არის პროგნოზი, რომელიც არის ბოლო ფენის გააქტიურება.
მინი პარტიული გრადიენტული დაღმართი
ჩვენი ქსელის კლასის სამუშაო ცხენი არის Gradient Descent. ამ ვერსიაში ჩვენ ვიყენებთ მინი პარტიულ (სტოქასტურ) გრადიენტულ დაღმართს, გრადიენტული წარმოშობის შეცვლილ ვარიანტს.
ეს მიუთითებს იმაზე, რომ მონაცემთა წერტილების მცირე ჯგუფი გამოყენებული იქნება ჩვენი მოდელის განახლებისთვის. ოთხი აუცილებელი და ერთი არჩევითი არგუმენტი გადაეცემა ამ მეთოდს. ოთხი საჭირო ცვლადია ტრენინგის მონაცემთა ნაკრები, ეპოქების რაოდენობა, მინი-სერიების ზომა და სწავლის სიჩქარე (eta).
ტესტის მონაცემები ხელმისაწვდომია მოთხოვნის შემთხვევაში. ჩვენ მოგაწვდით ტესტის მონაცემებს, როდესაც საბოლოოდ შევაფასებთ ამ ქსელს. ამ ფუნქციის ნიმუშების რაოდენობა თავდაპირველად დაყენებულია სიის სიგრძეზე, როგორც კი სასწავლო მონაცემები გადაკეთდება სიის ტიპად.
ჩვენ ასევე ვიყენებთ იმავე პროცესს მოცემული მონაცემების შესამოწმებლად. ეს იმიტომ ხდება, რომ ნაცვლად იმისა, რომ დაგვიბრუნონ როგორც სიები, ისინი ნამდვილად არიან სიების ზიპები. როდესაც მოგვიანებით ჩავტვირთავთ MNIST მონაცემთა ნიმუშებს, ამის შესახებ უფრო მეტს გავიგებთ.
თუ ჩვენ შეგვიძლია დავრწმუნდეთ, რომ ორივე სახის მონაცემებს ვაწვდით სიებს, მაშინ ეს ტიპის ჩამოსხმა სულაც არ არის აუცილებელი.
მას შემდეგ, რაც ჩვენ გვაქვს მონაცემები, ჩვენ ციკლურად გადავდივართ სასწავლო ეპოქებზე. ტრენინგის პერიოდი არის ნერვული ქსელის ტრენინგის მხოლოდ ერთი რაუნდი. ჩვენ პირველ რიგში ვურევთ მონაცემებს თითოეულ ეპოქაში, რათა უზრუნველვყოთ შემთხვევითობა მინი პარტიების სიის შედგენამდე.
განახლების მინი პარტიული ფუნქცია, რომელიც ქვემოთ იქნება განხილული, გამოიძახება თითოეული მინი პარტიისთვის. ტესტის სიზუსტე ასევე დაბრუნდება, თუ ტესტის მონაცემები ხელმისაწვდომია.
ღირებულება წარმოებული დამხმარე ფუნქცია
მოდით განვავითაროთ დამხმარე ფუნქცია სახელწოდებით ხარჯების წარმოებული, სანამ რეალურად შევქმნით უკანა გავრცელების კოდს. თუ შეცდომას დავუშვებთ ჩვენს გამომავალ ფენაში, ამას გვიჩვენებს ხარჯების წარმოებული ფუნქცია.
მას სჭირდება ორი შეყვანა: გამომავალი აქტივაციის მასივი და მოსალოდნელი გამომავალი მნიშვნელობების y-კოორდინატები.
უკან გავრცელების ფუნქცია
ჩვენი ამჟამინდელი აქტივაციის ვექტორი, აქტივაცია, ისევე როგორც ნებისმიერი სხვა აქტივაციის ვექტორი, აქტივაცია და z-ვექტორი, zs, უნდა იყოს მხედველობაში. ჯერ გააქტიურებულია ფენა, რომელსაც ეწოდება შეყვანის ფენა.
ჩვენ გავაანალიზებთ თითოეულ მიკერძოებას და წონას მათი დაყენების შემდეგ. თითოეული ციკლი გულისხმობს z ვექტორის გამოთვლას, როგორც წონების წერტილოვანი ნამრავლის სახით და აქტივაციას, მის დამატებას zs სიაში, აქტივაციის ხელახლა გამოთვლას და განახლებული აქტივაციის დამატებას აქტივაციის სიაში.
და ბოლოს, მათემატიკა. დელტა, რომელიც უდრის წინა ფენის შეცდომის გამრავლებას zs ვექტორების ბოლო ელემენტის სიგმოიდურ პრაიმზე, გამოითვლება მანამ, სანამ ჩვენ დავიწყებთ უკან გადასასვლელს.
ნაბლა b-ის ბოლო ფენა დაყენებულია, როგორც დელტა, ხოლო ნაბლა w-ის საბოლოო ფენა დაყენებულია, როგორც დელტას წერტილოვანი ნამრავლი და აქტივაციის მეორე-ბოლო ფენა (გადატანილია ისე, რომ რეალურად შეგვიძლია გავაკეთოთ მათემატიკა) .
ვაგრძელებთ როგორც ადრე, ვიწყებთ მეორე ფენით და ვამთავრებთ ბოლო და ვიმეორებთ პროცესს ამ ბოლო ფენების დასრულების შემდეგ. შემდეგ ნაბლას უკან უბრუნდება ტუპლის სახით.
მიმდინარეობს მინი-სერიული გრადიენტური წარმოშობის განახლება
ჩვენი SGD (სტოქასტური გრადიენტული დაღმართის) მეთოდი ადრინდელი მოიცავს მინი-სერიების განახლებას. იმის გამო, რომ ის გამოიყენება SGD-ში, მაგრამ ასევე მოითხოვს backprop-ს, მე ვიმსჯელე, სად უნდა განვათავსო ეს ფუნქცია.
საბოლოოდ, მე გავაკეთე არჩევანი, გამომექვეყნებინა აქ. ის იწყება მიკერძოების და წონების ნაბლასების 0 ვექტორის გენერირებით, ისევე, როგორც ეს ჩვენი backprop ფუნქცია გააკეთა.
ის მოითხოვს მინი პარტიას და eta სწავლის სიჩქარეს, როგორც მის ორ შეყვანას. მინი პარტიაში, ჩვენ ვიყენებთ backprop ფუნქციას, რათა მივიღოთ თითოეული ნაბლა მასივის დელტა თითოეული შეყვანისთვის, x და გამომავალი, y. შემდეგ ნაბლა სიები განახლდება ამ დელტაებით.
და ბოლოს, ჩვენ ვიყენებთ სწავლის სიჩქარეს და ნაბლას ქსელის წონების და მიკერძოების გასაახლებლად. თითოეული მნიშვნელობა განახლებულია უახლეს მნიშვნელობამდე, სწავლის სიჩქარის გამოკლებით, მრავლდება მინი-სერიის ზომაზე და შემდეგ ემატება nabla მნიშვნელობას.
ფუნქციის შეფასება
შეფასების ფუნქცია არის ბოლო, რომელიც უნდა დავწეროთ. ტესტის მონაცემები არის ერთადერთი შეყვანა ამ ფუნქციისთვის. ამ ფუნქციაში ჩვენ მხოლოდ ქსელის გამოსავალს ვადარებთ მოსალოდნელ შედეგს, y. შეყვანის, x, წინსვლის მიწოდებით, განისაზღვრება ქსელის გამომავალი.
სრული კოდი
როდესაც ჩვენ ვაერთებთ ყველა კოდს, ის ასე გამოიყურება.
ნერვული ქსელის ტესტირება
მიმდინარეობს MNIST მონაცემების ჩატვირთვა
ის 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-ის გამოყენებით, ჩვენ ვქმნით ნერვულ ქსელს ნულიდან. მაღალი დონის მათემატიკასთან ერთად განვიხილეთ განხორციელების სპეციფიკაც.
დავიწყეთ დამხმარე ფუნქციების განხორციელებით. ნეირონების მუშაობისთვის, სიგმოიდური და სიგმოიდური ძირითადი ფუნქციები გადამწყვეტია. შემდეგ ჩვენ პრაქტიკაში გამოვიყენებთ უკუკავშირის ფუნქციას, რომელიც არის ფუნდამენტური პროცესი ნერვულ ქსელში მონაცემების შესატანად.
შემდეგ ჩვენ შევქმენით გრადიენტური დაღმართის ფუნქცია პითონში, ძრავა, რომელიც მართავს ჩვენს ნერვულ ქსელს. იმისათვის, რომ აღმოვაჩინოთ „ლოკალური მინიმუმები“ და ოპტიმიზაცია გაუწიოს მათ წონას და მიკერძოებას, ჩვენი ნერვული ქსელი იყენებს გრადიენტულ დაცემას. ჩვენ შევქმენით backpropagation ფუნქცია გამოყენებით გრადიენტური დაღმართი.
განახლებების მიწოდებით, როდესაც შედეგები არ ემთხვევა შესაბამის ეტიკეტებს, ეს ფუნქცია საშუალებას აძლევს ნერვულ ქსელს „ისწავლოს“.
და ბოლოს, ჩვენ დავაყენებთ ჩვენს ახალ პითონს ნერვული ქსელის ტესტირება MNIST მონაცემთა ნაკრების გამოყენებით. ყველაფერი შეუფერხებლად მუშაობდა.
ბედნიერი კოდირება!
დატოვე პასუხი