კომპიუტერული ხედვა Jupyter ნოუთბუქი · TensorFlow

როგორ ხედავს ნერვული ქსელი კატას

ეს არის პრაქტიკული ნოუთბუქი. წაიკითხე კოდი და შედეგები აქ, ან გაუშვი ინტერაქტიულად Google Colab-ში ან Jupyter-ში.

ImageNet-ზე წინასწარ გაწვრთნილ ნერვულ ქსელს შეუძლია ამოიცნოს ნებისმიერი 1000 სხვადასხვა კლასის ობიექტი, როგორიცაა სხვადასხვა ჯიშის კატა. საინტერესო იქნებოდა, თუ როგორ გამოიყურება იდეალური სიამის კატა ნერვული ქსელისთვის.

რა თქმა უნდა, თქვენ შეგიძლიათ შეცვალოთ siamese cat ნებისმიერი სხვა ImageNet კლასით.

დასაწყებად, მოდით ჩატვირთოთ VGG ქსელი:

იტვირთება…
გამოტანა
2022-06-17 13:28:58.931467: I tensorflow/core/platform/cpu_feature_guard.cc:151] This TensorFlow binary is optimized with oneAPI Deep Neural Network Library (oneDNN) to use the following CPU instructions in performance-critical operations:  AVX2 FMA
To enable them in other operations, rebuild TensorFlow with the appropriate compiler flags.
2022-06-17 13:28:59.603736: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1525] Created device /job:localhost/replica:0/task:0/device:GPU:0 with 15401 MB memory:  -> device: 0, name: Tesla P100-PCIE-16GB, pci bus id: 0001:00:00.0, compute capability: 6.0

Optimizing for Result

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

Optimization Loop

Here is our starting image:

იტვირთება…
გამოტანა
<matplotlib.image.AxesImage at 0x7f90a0277ac0>
ნოუთბუქის გამოტანა

ჩვენ ვიყენებთ normalize ფუნქციას ჩვენი მნიშვნელობების 0-1 დიაპაზონში მოსაყვანად.

თუ ამ სურათზე ჩვენს VGG ქსელს დავუძახებთ, მივიღებთ ალბათობების მეტ-ნაკლებად შემთხვევით განაწილებას:

იტვირთება…
გამოტანა
2022-06-17 13:29:02.100818: I tensorflow/stream_executor/cuda/cuda_dnn.cc:368] Loaded cuDNN version 8303
2022-06-17 13:29:02.570980: I tensorflow/core/platform/default/subprocess.cc:304] Start cannot spawn child process: No such file or directory
Predicted class: 669 (mosquito net)
Probability of predicted class = 0.05466596782207489
ნოუთბუქის გამოტანა

მიუხედავად იმისა, რომ შეიძლება ჩანდეს, რომ ერთ-ერთი კლასის ალბათობა გაცილებით მაღალია, ვიდრე სხვები, ის მაინც ძალიან დაბალია - შეხედეთ მასშტაბს, რომ ნახოთ, რომ რეალური ალბათობა ჯერ კიდევ დაახლოებით 5%-ია.

ახლა მოდით ავირჩიოთ ერთი სამიზნე კატეგორია (მაგ. სიამური კატა) და დავიწყოთ გამოსახულების კორექტირება გრადიენტული დაღმართის გამოყენებით. თუ $x$ არის შეყვანის სურათი, ხოლო $V$ არის VGG ქსელი, ჩვენ გამოვთვლით ზარალის ფუნქციას $\mathcal{L} = \mathcal{L}(c,V(x))$ (სადაც $c$ არის სამიზნე კატეგორია) და დავარეგულიროთ $x$ შემდეგი ფორმულის გამოყენებით: $$ x^{(i+1)} = x^{(i)} - \eta{\partial \mathcal{L}\over\partial x} $$ ზარალის ფუნქცია იქნება ჯვარედინი ენტროპიის დაკარგვა, რადგან ჩვენ ვადარებთ ორ ალბათობის განაწილებას. ჩვენს შემთხვევაში, რადგან კლასი წარმოდგენილია რიცხვით და არა one-hot დაშიფრული ვექტორით, ჩვენ გამოვიყენებთ სპარს კატეგორიულ ჯვარედინი ენტროპიას.

ჩვენ გავიმეორებთ ამ პროცესს რამდენიმე ეპოქის განმავლობაში, გამოსახულებას ვბეჭდავთ.

უმჯობესია შეასრულოთ ეს კოდი GPU-ზე ჩართული გამოთვლებზე, ან შეამციროთ ეპოქების რაოდენობა, რათა მინიმუმამდე დაიყვანოთ ლოდინის დრო.

იტვირთება…
გამოტანა
Epoch: 900, loss: 0.5220473408699036
ნოუთბუქის გამოტანა
იტვირთება…
გამოტანა
Predicted class: 284 (Siamese cat, Siamese)
Probability of predicted class = 0.6449142098426819
ნოუთბუქის გამოტანა

ჩვენ ახლა მივიღეთ სურათი, რომელიც ჰგავს კატას ნერვული ქსელისთვის, მიუხედავად იმისა, რომ ჩვენთვის ის მაინც ხმაურს ჰგავს. თუ ოპტიმიზაციას ვაკეთებთ ცოტა ხანს - სავარაუდოდ მივიღებთ იდეალური ხმაურიანი კატის იმიჯს, რომლის ალბათობა 1-თან ახლოსაა.

ხმაურის გრძნობა

This noise does not make a lot of sense for us, but most probably it contains a lot of low-level filters that are typical for a cat. თუმცა, იმის გამო, რომ იდეალური შედეგისთვის შეყვანის ოპტიმიზაციის ძალიან ბევრი გზა არსებობს, ოპტიმიზაციის ალგორითმი არ არის მოტივირებული ვიზუალურად გასაგები შაბლონების მოსაძებნად.

To make this look a little bit less like a noise, we can introduce an additional term to the loss function - variation loss. ის ზომავს რამდენად მსგავსია გამოსახულების მეზობელი პიქსელები. თუ ამ ტერმინს დავამატებთ ჩვენს დაკარგვის ფუნქციას, ეს აიძულებს ოპტიმიზატორს მოძებნოს გადაწყვეტილებები ნაკლები ხმაურით და, შესაბამისად, ჰქონდეს მეტი ცნობადი დეტალი.

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

იტვირთება…
გამოტანა
Epoch: 900, loss: [27.257]
ნოუთბუქის გამოტანა

This is the ideal image of a cat for our neural network, and we can also see some of the familiar features, such as eyes and ears. There are many of them, which makes neural network even more certain that this is a cat.

იტვირთება…
გამოტანა
Predicted class: 284 (Siamese cat, Siamese)
Probability of predicted class = 0.9201651215553284
ნოუთბუქის გამოტანა

ასევე ვნახოთ, როგორ გამოიყურება სხვა ობიექტი VGG-სთვის:

იტვირთება…
გამოტანა
Epoch: 900, loss: [29.59]
ნოუთბუქის გამოტანა

მოწინააღმდეგე შეტევები

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

იტვირთება…
გამოტანა
<matplotlib.image.AxesImage at 0x7f8fd816e0a0>
ნოუთბუქის გამოტანა

ჩვენ ვხედავთ, რომ ეს სურათი აშკარად არის აღიარებული, როგორც ძაღლი:

იტვირთება…
გამოტანა
Predicted class: 171 (Italian greyhound)
Probability of predicted class = 0.9281901121139526
ნოუთბუქის გამოტანა

ახლა ჩვენ გამოვიყენებთ ამ სურათს საწყის წერტილად და შევეცდებით მისი ოპტიმიზაციას, რომ გახდეს კატა:

იტვირთება…
გამოტანა
Epoch: 90, loss: 0.15769274532794952
ნოუთბუქის გამოტანა
იტვირთება…
გამოტანა
Predicted class: 284 (Siamese cat, Siamese)
Probability of predicted class = 0.8651191592216492
ნოუთბუქის გამოტანა

ასე რომ, ზემოთ მოცემული სურათი შესანიშნავი კატაა, VGG ქსელის თვალსაზრისით!

ექსპერიმენტი ResNet-ით

Let's now see how this same image is classified by a different model, say, ResNet:

იტვირთება…

ვინაიდან ჩვენ გამოვიყენეთ model როგორც გლობალური ცვლადი, ამიერიდან ყველა ფუნქცია გამოიყენებს ResNet-ს VGG-ის ნაცვლად

იტვირთება…
გამოტანა
Predicted class: 111 (nematode, nematode worm, roundworm)
Probability of predicted class = 0.13089127838611603
ნოუთბუქის გამოტანა

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

ვნახოთ, როგორ გამოიყურება იდეალური ზებრა ResNet-ისთვის:

იტვირთება…
გამოტანა
Epoch: 450, loss: [46.166]
ნოუთბუქის გამოტანა
იტვირთება…
გამოტანა
Predicted class: 340 (zebra)
Probability of predicted class = 0.8876020312309265
ნოუთბუქის გამოტანა

ეს სურათი საკმაოდ განსხვავებულია, რაც გვეუბნება, რომ ნერვული ქსელის არქიტექტურა, ალბათ, საკმაოდ მნიშვნელოვან როლს ასრულებს ობიექტების ამოცნობაში.

ამოცანა: შეეცადეთ განახორციელოთ საპირისპირო მიმაგრება ResNet-ზე და შეადარეთ შედეგები.

სხვადასხვა ოპტიმიზატორების გამოყენება

In our example, we have been using the simplest optimization technique - gradient descent. However, Keras framework contains different built-in ოპტიმიზატორები, and we can use them instead of gradient descent. ეს მოითხოვს ძალიან მცირე ცვლილებას ჩვენს კოდში - ჩვენ შევცვლით ნაწილს, სადაც ვარეგულირებთ შეყვანის სურათს x.assign_sub(eta*grads) ოპტიმიზატორის apply_gradients ფუნქციაზე გამოძახებით:

იტვირთება…
გამოტანა
Epoch: 900, loss: [41.451]
ნოუთბუქის გამოტანა

დასკვნა

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

ეს გაკვეთილი არის Microsoft “AI for Beginners” კურსის ქართული თარგმანი, გავრცელებული MIT ლიცენზიით.