წინა განყოფილებაში ვისწავლეთ, როგორ განვსაზღვროთ მრავალშრიანი ნერვული ქსელი კლასის განსაზღვრის გამოყენებით, მაგრამ ეს ქსელები იყო ზოგადი და არა სპეციალიზებული კომპიუტერული ხედვის ამოცანებისთვის. ამ განყოფილებაში გავეცნობით კონვოლუციურ ნერვულ ქსელებს (CNN), რომლებიც სპეციალურად შექმნილია კომპიუტერული ხედვისთვის.
კომპიუტერული ხედვა განსხვავდება ზოგადი კლასიფიკაციისგან, რადგან როდესაც ჩვენ ვცდილობთ ვიპოვოთ გარკვეული ობიექტი სურათზე, ჩვენ სკანირებთ სურათს, ვეძებთ კონკრეტულ შაბლონებს და მათ კომბინაციებს. მაგალითად, როდესაც ვეძებთ კატას, ჩვენ ჯერ შეიძლება მოვძებნოთ ჰორიზონტალური ხაზები, რომლებსაც შეუძლიათ შექმნან ულვაში, შემდეგ კი ულვაშების გარკვეულმა კომბინაციამ შეიძლება გვითხრას, რომ ეს სინამდვილეში კატის სურათია. მნიშვნელოვანია გარკვეული შაბლონების შედარებითი პოზიცია და არსებობა და არა მათი ზუსტი პოზიცია სურათზე.
შაბლონების ამოსაღებად, ჩვენ გამოვიყენებთ კონვოლუციური ფილტრების ცნებას. მაგრამ პირველ რიგში, მოდით ჩატვირთოთ ყველა დამოკიდებულება და ფუნქცია, რომელიც განვსაზღვრეთ წინა ერთეულებში.
იტვირთება…კონვოლუციური ფილტრები
კონვოლუციური ფილტრები არის პატარა ფანჯრები, რომლებიც გადადიან გამოსახულების თითოეულ პიქსელზე და ითვლის მეზობელი პიქსელების საშუალო შეწონილებას.
ისინი განისაზღვრება წონის კოეფიციენტების მატრიცებით. მოდით ვნახოთ ორი განსხვავებული კონვოლუციური ფილტრის გამოყენების მაგალითები ჩვენს MNIST ხელნაწერ ციფრებზე:
იტვირთება…გამოტანა


პირველ ფილტრს ეწოდება ვერტიკალური კიდეების ფილტრი და ის განისაზღვრება შემდეგი მატრიცით: $$ \მარცხნივ( \დაწყება{მატრიცა} -1 & 0 & 1 \ კრ -1 & 0 & 1 \ კრ -1 & 0 & 1 \ კრ \დასრულება{მატრიცა} \ მარჯვენა) $$ როდესაც ეს ფილტრი გადადის შედარებით ერთგვაროვან პიქსელის ველზე, ყველა მნიშვნელობა ემატება 0-მდე. თუმცა, როდესაც ის ხვდება ვერტიკალურ კიდეს სურათზე, წარმოიქმნება მაღალი მწვერვალის მნიშვნელობა. სწორედ ამიტომ, ზემოთ მოცემულ სურათებზე შეგიძლიათ იხილოთ ვერტიკალური კიდეები, რომლებიც წარმოდგენილია მაღალი და დაბალი მნიშვნელობებით, ხოლო ჰორიზონტალური კიდეები არის საშუალოდ.
საპირისპირო ხდება, როდესაც ვაყენებთ ჰორიზონტალურ კიდეების ფილტრს - ჰორიზონტალური ხაზები ძლიერდება, ხოლო ვერტიკალური საშუალოდ.
კლასიკურ კომპიუტერულ ხედვაში მრავალი ფილტრი გამოიყენებოდა სურათზე ფუნქციების შესაქმნელად, რომლებიც შემდეგ გამოიყენებოდა მანქანური სწავლების ალგორითმის მიერ კლასიფიკატორის შესაქმნელად. თუმცა, ღრმა სწავლისას ჩვენ ვაშენებთ ქსელებს, რომლებიც ვისწავლიან საუკეთესო კონვოლუციურ ფილტრებს კლასიფიკაციის პრობლემის გადასაჭრელად.
ამისათვის ჩვენ წარმოგიდგენთ კონვოლუციურ ფენებს.
კოვოლუციური ფენები
კონვოლუციური ფენები განისაზღვრება nn.Conv2d კონსტრუქციის გამოყენებით. ჩვენ უნდა დავაკონკრეტოთ შემდეგი:
in_channels- შეყვანის არხების რაოდენობა. ჩვენს შემთხვევაში საქმე გვაქვს ნაცრისფერი მასშტაბის გამოსახულებასთან, შესაბამისად შეყვანის არხების რაოდენობა არის 1.out_channels- გამოსაყენებელი ფილტრების რაოდენობა. ჩვენ გამოვიყენებთ 9 განსხვავებულ ფილტრს, რაც ქსელს მისცემს უამრავ შესაძლებლობას გამოიკვლიოს რომელი ფილტრები მუშაობს საუკეთესოდ ჩვენი სცენარისთვის.kernel_sizeis the size of the sliding window. ჩვეულებრივ გამოიყენება 3x3 ან 5x5 ფილტრები.
უმარტივესი CNN შეიცავს ერთ კონვოლუციურ ფენას. 28x28 შეყვანის ზომის გათვალისწინებით, ცხრა 5x5 ფილტრის გამოყენების შემდეგ მივიღებთ ტენსორს 9x24x24 (სივრცითი ზომა უფრო მცირეა, რადგან მხოლოდ 24 პოზიციაა, სადაც 5 სიგრძის მოცურების ინტერვალი შეიძლება მოერგოს 28 პიქსელს).
კონვოლუციის შემდეგ, ჩვენ ვასწორებთ 9x24x24 ტენსორს 5184 ზომის ერთ ვექტორად და შემდეგ ვამატებთ ხაზოვან ფენას 10 კლასის შესაქმნელად. ჩვენ ასევე ვიყენებთ relu აქტივაციის ფუნქციას შრეებს შორის.
იტვირთება…გამოტანა
==========================================================================================
Layer (type:depth-idx) Output Shape Param #
==========================================================================================
├─Conv2d: 1-1 [1, 9, 24, 24] 234
├─Flatten: 1-2 [1, 5184] --
├─Linear: 1-3 [1, 10] 51,850
==========================================================================================
Total params: 52,084
Trainable params: 52,084
Non-trainable params: 0
Total mult-adds (M): 0.18
==========================================================================================
Input size (MB): 0.00
Forward/backward pass size (MB): 0.04
Params size (MB): 0.21
Estimated Total Size (MB): 0.25
==========================================================================================თქვენ ხედავთ, რომ ეს ქსელი შეიცავს დაახლოებით 50k სასწავლო პარამეტრს, შედარებით დაახლოებით 80k სრულად დაკავშირებულ მრავალ ფენიან ქსელებში. ეს საშუალებას გვაძლევს მივაღწიოთ კარგ შედეგებს თუნდაც მცირე მონაცემთა ნაკრებებზე, რადგან კონვოლუციური ქსელები ბევრად უკეთესად განზოგადება.
იტვირთება…გამოტანა
Epoch 0, Train acc=0.947, Val acc=0.969, Train loss=0.001, Val loss=0.001
Epoch 1, Train acc=0.979, Val acc=0.975, Train loss=0.001, Val loss=0.001
Epoch 2, Train acc=0.985, Val acc=0.977, Train loss=0.000, Val loss=0.001
Epoch 3, Train acc=0.988, Val acc=0.975, Train loss=0.000, Val loss=0.001
Epoch 4, Train acc=0.988, Val acc=0.976, Train loss=0.000, Val loss=0.001

როგორც ხედავთ, ჩვენ შეგვიძლია მივაღწიოთ უფრო მაღალ სიზუსტეს და ბევრად უფრო სწრაფად, წინა განყოფილების სრულად დაკავშირებულ ქსელებთან შედარებით.
ჩვენ ასევე შეგვიძლია ვიზუალურად წარმოვადგინოთ ჩვენი გაწვრთნილი კონვოლუციური ფენების წონა, რათა ვცადოთ უფრო მეტი გაგება, თუ რა ხდება:
იტვირთება…გამოტანა

თქვენ ხედავთ, რომ ზოგიერთი ფილტრი გამოიყურება ისე, რომ მათ შეუძლიათ ამოიცნონ ზოგიერთი ირიბი დარტყმა, ზოგი კი საკმაოდ შემთხვევით გამოიყურება.
მრავალ ფენიანი CNN და გაერთიანების ფენები
პირველი კონვოლუციური ფენები ეძებს პრიმიტიულ შაბლონებს, როგორიცაა ჰორიზონტალური ან ვერტიკალური ხაზები, მაგრამ ჩვენ შეგვიძლია გამოვიყენოთ შემდგომი კონვოლუციური ფენები მათ თავზე უფრო მაღალი დონის შაბლონების მოსაძებნად, როგორიცაა პრიმიტიული ფორმები. შემდეგ უფრო კონვოლუციურ ფენებს შეუძლიათ გააერთიანონ ეს ფორმები სურათის ზოგიერთ ნაწილში, საბოლოო ობიექტამდე, რომლის კლასიფიკაციასაც ვცდილობთ.
ამის გაკეთებისას ჩვენ ასევე შეგვიძლია გამოვიყენოთ ერთი ხრიკი: სურათის სივრცითი ზომის შემცირება. მას შემდეგ რაც აღმოვაჩინეთ, რომ არის ჰორიზონტალური სტოკი მოცურების 3x3 ფანჯარაში, არც ისე მნიშვნელოვანია, რომელ პიქსელზე მოხდა ის. ამრიგად, ჩვენ შეგვიძლია "შემცირდეს" გამოსახულების ზომა, რაც კეთდება ერთ-ერთი გაერთიანების ფენის გამოყენებით:
- Average Pooling იღებს მოცურების ფანჯარას (მაგალითად, 2x2 პიქსელი) და ითვლის საშუალო მნიშვნელობებს ფანჯარაში
- Max Pooling ცვლის ფანჯარას მაქსიმალური მნიშვნელობით. მაქსიმალური გაერთიანების იდეა არის გარკვეული ნიმუშის არსებობის გამოვლენა მოცურების ფანჯარაში.
ამრიგად, ტიპიურ CNN-ში იქნება რამდენიმე კონვოლუციური ფენა, მათ შორის ფენების გაერთიანებით, რათა შემცირდეს გამოსახულების ზომები. ჩვენ ასევე გავზრდით ფილტრების რაოდენობას, რადგან შაბლონები უფრო დახვეწილი ხდება - უფრო სავარაუდოა საინტერესო კომბინაციები, რომლებიც უნდა ვეძებოთ.

სივრცითი ზომების შემცირებისა და ფუნქციების/ფილტრების ზომების გაზრდის გამო, ამ არქიტექტურას ასევე უწოდებენ პირამიდის არქიტექტურას.
იტვირთება…გამოტანა
==========================================================================================
Layer (type:depth-idx) Output Shape Param #
==========================================================================================
├─Conv2d: 1-1 [1, 10, 24, 24] 260
├─MaxPool2d: 1-2 [1, 10, 12, 12] --
├─Conv2d: 1-3 [1, 20, 8, 8] 5,020
├─MaxPool2d: 1-4 [1, 20, 4, 4] --
├─Linear: 1-5 [1, 10] 3,210
==========================================================================================
Total params: 8,490
Trainable params: 8,490
Non-trainable params: 0
Total mult-adds (M): 0.47
==========================================================================================
Input size (MB): 0.00
Forward/backward pass size (MB): 0.06
Params size (MB): 0.03
Estimated Total Size (MB): 0.09
==========================================================================================გაითვალისწინეთ რამდენიმე რამ ამ განმარტების შესახებ:
- ნაცვლად
Flattenფენის გამოყენებისა, ჩვენ ვასწორებთ ტენსორსforwardფუნქციის შიგნითviewფუნქციის გამოყენებით. ვინაიდან გაბრტყელ ფენას არ აქვს სავარჯიშო წონა, არ არის აუცილებელი, რომ შევქმნათ ცალკე ფენის მაგალითი ჩვენს კლასში. - ჩვენ ვიყენებთ გაერთიანების ფენის მხოლოდ ერთ ეგზემპლარს ჩვენს მოდელში, ასევე იმიტომ, რომ ის არ შეიცავს რაიმე ტრენინგ პარამეტრს და ეს ერთი მაგალითი შეიძლება ეფექტურად იქნას გამოყენებული.
- სავარჯიშო პარამეტრების რაოდენობა (~8.5K) მკვეთრად ნაკლებია, ვიდრე წინა შემთხვევებში. ეს იმიტომ ხდება, რომ კონვოლუციურ ფენებს ზოგადად აქვთ რამდენიმე პარამეტრი და გამოსახულების განზომილება საბოლოო მკვრივი ფენის გამოყენებამდე მნიშვნელოვნად მცირდება. პარამეტრების მცირე რაოდენობა დადებითად აისახება ჩვენს მოდელებზე, რადგან ეს ხელს უწყობს მონაცემთა გადაჭარბების თავიდან აცილებას მონაცემთა მცირე ზომის ზომებზეც კი.
იტვირთება…გამოტანა
Epoch 0, Train acc=0.952, Val acc=0.977, Train loss=0.001, Val loss=0.001
Epoch 1, Train acc=0.982, Val acc=0.983, Train loss=0.000, Val loss=0.000
Epoch 2, Train acc=0.986, Val acc=0.983, Train loss=0.000, Val loss=0.000
Epoch 3, Train acc=0.986, Val acc=0.978, Train loss=0.000, Val loss=0.001
Epoch 4, Train acc=0.987, Val acc=0.981, Train loss=0.000, Val loss=0.000
რაც თქვენ ალბათ უნდა დააკვირდეთ არის ის, რომ ჩვენ შეგვიძლია მივაღწიოთ უფრო მაღალ სიზუსტეს, ვიდრე მხოლოდ ერთი ფენით და ბევრად უფრო სწრაფად - მხოლოდ 1 ან 2 ეპოქით. ეს ნიშნავს, რომ დახვეწილი ქსელის არქიტექტურას გაცილებით ნაკლები მონაცემები სჭირდება იმის გასარკვევად, თუ რა ხდება და ჩვენი სურათებიდან ზოგადი შაბლონების ამოსაღებად.
თამაში რეალურ სურათებთან CIFAR-10 მონაცემთა ნაკრებიდან
მიუხედავად იმისა, რომ ჩვენი ხელნაწერი ციფრების ამოცნობის პრობლემა შეიძლება სათამაშოს პრობლემად ჩანდეს, ახლა ჩვენ მზად ვართ გავაკეთოთ უფრო სერიოზული. მოდით გამოვიკვლიოთ სხვადასხვა ობიექტების სურათების უფრო გაფართოებული მონაცემთა ნაკრები, სახელწოდებით CIFAR-10. იგი შეიცავს 60k 32x32 სურათს, დაყოფილია 10 კლასად.
იტვირთება…გამოტანა
Downloading https://www.cs.toronto.edu/~kriz/cifar-10-python.tar.gz to ./data/cifar-10-python.tar.gz
HBox(children=(FloatProgress(value=1.0, bar_style='info', max=1.0), HTML(value='')))Extracting ./data/cifar-10-python.tar.gz to ./data
Files already downloaded and verified
იტვირთება…გამოტანა

A well-known architecture for CIFAR-10 is called ლენეტი, and has been proposed by Yann LeCun. It follows the same principles as we have outlined above, the main difference being 3 input color channels instead of 1.
ჩვენ ასევე ვაკეთებთ ამ მოდელს კიდევ ერთ გამარტივებას - ჩვენ არ ვიყენებთ log_softmax როგორც გამომავალი აქტივაციის ფუნქციას და უბრალოდ ვაბრუნებთ ბოლო სრულად დაკავშირებული ფენის გამომავალს. ამ შემთხვევაში ჩვენ შეგვიძლია უბრალოდ გამოვიყენოთ CrossEntropyLoss დაკარგვის ფუნქცია მოდელის ოპტიმიზაციისთვის.
იტვირთება…გამოტანა
==========================================================================================
Layer (type:depth-idx) Output Shape Param #
==========================================================================================
├─Conv2d: 1-1 [1, 6, 28, 28] 456
├─MaxPool2d: 1-2 [1, 6, 14, 14] --
├─Conv2d: 1-3 [1, 16, 10, 10] 2,416
├─MaxPool2d: 1-4 [1, 16, 5, 5] --
├─Conv2d: 1-5 [1, 120, 1, 1] 48,120
├─Flatten: 1-6 [1, 120] --
├─Linear: 1-7 [1, 64] 7,744
├─Linear: 1-8 [1, 10] 650
==========================================================================================
Total params: 59,386
Trainable params: 59,386
Non-trainable params: 0
Total mult-adds (M): 0.65
==========================================================================================
Input size (MB): 0.01
Forward/backward pass size (MB): 0.05
Params size (MB): 0.24
Estimated Total Size (MB): 0.30
==========================================================================================ამ ქსელის სწორად მომზადებას მნიშვნელოვანი დრო დასჭირდება და სასურველია განხორციელდეს GPU-ზე ჩართული გამოთვლებით.
იტვირთება…გამოტანა
Epoch 0, Train acc=0.261, Val acc=0.388, Train loss=0.143, Val loss=0.121
Epoch 1, Train acc=0.437, Val acc=0.491, Train loss=0.110, Val loss=0.101
Epoch 2, Train acc=0.508, Val acc=0.522, Train loss=0.097, Val loss=0.094
სიზუსტე, რომელიც ჩვენ შევძელით ვარჯიშის 3 ეპოქით, დიდი არ ჩანს. თუმცა, გახსოვდეთ, რომ ბრმა გამოცნობა მხოლოდ 10%-იან სიზუსტეს მოგვცემს და რომ ჩვენი პრობლემა რეალურად ბევრად უფრო რთულია, ვიდრე MNIST ციფრული კლასიფიკაცია. ასეთ მოკლე ვარჯიშში 50%-ზე მეტი სიზუსტის მიღწევა კარგი მიღწევაა.
Takeaways
ამ განყოფილებაში ჩვენ ვისწავლეთ კომპიუტერული ხედვის ნერვული ქსელების მთავარი კონცეფცია - კონვოლუციური ქსელები. რეალური არქიტექტურები, რომლებიც აძლიერებენ გამოსახულების კლასიფიკაციას, ობიექტების ამოცნობას და სურათების გენერირების ქსელებსაც კი, ყველა დაფუძნებულია CNN-ზე, მხოლოდ მეტი ფენით და დამატებითი სასწავლო ხრიკებით.