به نام خدا

تمرین عملی 2: طبقه بندی تصاویر Cifar10 با شبکه های کانولوشنالی روی googleColab

Run in Google Colab

صورت مساله

با شبکه های کانولوشنالی آشنا شدیم
توصیه می‌شود حتما بعد از تمرین اول این تمرین را حل کنید و قبل از این تمرین نوت بوک زیر را مرور کنید:

06_ConvolutionalNeuralNetwork-Hoda-Keras.ipynb

در این تمرین از مجموعه داده تصویری cifar10 استفاده خواهیم کرد.
خیلی از اوقات ممکنه دسترسی به GPU نداشته باشیم. حخوشبختانه سرویس های آنلاین و رایگانی هستند که توان محاسباتی رایگان در اختیارمان میگذراند. در این تمرین از شما خواسته شده که این نوت بوک را در گوگل کولب اجرا کنید.
قبلا در مورد گوگل کولب دو پست آموزشی نوشته شده است که در صورت تمایل به کسب اطلاعات بیشتر میتوانید بخوانید. اما برای اجرا این تمرین نیازی به این جزئیات نخواهید داشت.

آشنایی با سرویس ابری Google Colab

اتصال مستقیم سرویس کولب (Google Colab) به درایو (Google Drive) از طریق فایل سیستم FUSE

لود کتابخانه های مورد نیاز

کتابخانه های مورد نیاز این تمرین لود شده اند
در صورت نیاز میتوانید کتابخانه های بیشتری لود کنید:
In [1]:
from tensorflow import keras
from keras.models import Sequential
from keras.layers import Dense, Flatten, Dropout
from keras.layers import Conv2D, MaxPooling2D
from keras.datasets import cifar10
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
Using TensorFlow backend.

مجموعه داده ی Cifar10


این مجموعه داده تصاویر رنگی در اندازه ی 32 در 32 و در 10 کلاس مختلف شامل ماشین، کامیون، اسب و ... است که در چارچوب کراس موجود است و از همان استفاده میکنیم.
اطلاعات بیشتر در مورد این مجموعه داده را از سایت این مجموعه داده میتوانید مطالعه کنید:

https://www.cs.toronto.edu/~kriz/cifar.html

In [2]:
(x_train, y_train), (x_test, y_test) = cifar10.load_data()

نگاهی به مجموعه داده بیندازیم...

در زیر تصویری که در اندیس 7-ام این مجموعه داده قرار دارد را مشاهده می‌کنیم. این شماره را را به دلخوه عوض کنید و چند تصویر دیگر این مجموعه داده را ببینید.
In [3]:
plt.imshow(x_train[7])
Out[3]:
<matplotlib.image.AxesImage at 0x2800004ab38>

سوال 1:

ماتریس های تصویر را تبدیل به نوع داده ای float32 کنید و مقادیر پیکسل ها را نرمال کنید و بین 0 و 1 بیاورید.
راهنمایی: شما باید متد astype را صدا بزنید و در نهایت مقادیر پیکسل ها را تقسیم بر 255 کنید.
In [4]:
x_train = 
x_test = 

سوال 2:

همان طور که میبینید لیبل ها از نوع عددی هستند. آن ها را تبدیل به فرمت one-hot کنید.


تعدادی از لیبل ها قبل از تبدیل به فرمت one-hot:
In [5]:
y_train[0:10]
Out[5]:
array([[6],
       [9],
       [9],
       [4],
       [1],
       [1],
       [2],
       [7],
       [8],
       [3]], dtype=uint8)
In [6]:
y_train = 
y_test = 
تعدادی از لیبل ها بعد از تبدیل به فرمت one-hot:
In [7]:
y_train[0:10]
Out[7]:
array([[0., 0., 0., 0., 0., 0., 1., 0., 0., 0.],
       [0., 0., 0., 0., 0., 0., 0., 0., 0., 1.],
       [0., 0., 0., 0., 0., 0., 0., 0., 0., 1.],
       [0., 0., 0., 0., 1., 0., 0., 0., 0., 0.],
       [0., 1., 0., 0., 0., 0., 0., 0., 0., 0.],
       [0., 1., 0., 0., 0., 0., 0., 0., 0., 0.],
       [0., 0., 1., 0., 0., 0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0., 0., 0., 1., 0., 0.],
       [0., 0., 0., 0., 0., 0., 0., 0., 1., 0.],
       [0., 0., 0., 1., 0., 0., 0., 0., 0., 0.]], dtype=float32)

سوال 3:

یک شبکه کانولوشنالی با معماری زیر بسازید:
  • یک لایه کانولوشنی با32 فیلتر با سایز فیلتر 3x3 و تابع فعالیت relu
  • لایه ی pooling با pool_size=(2,2)
  • یک لایه کانولوشنی با32 فیلتر با سایز فیلتر 3x3 و تابع فعالیت relu
  • لایه ی pooling با pool_size=(2,2)
  • یک لایه کانولوشنی با64 فیلتر با سایز فیلتر 3x3 و تابع فعالیت relu
  • لایه ی pooling با pool_size=(2,2)
  • استفاده از لایه ی Flatten() . به نظرتون چرا؟
  • یک لایه Dropout با ترخ 0.5.
  • یک لایه softmax برای احتمالات خروجی. به نظرتون این لایه چند نوران میخواهد؟
In [8]:

سوال 4:

مدل را کامپایل کنید و به عنوان optimizer متغیر opt_rms به تابع ارسال کنید.
In [9]:
opt_rms = keras.optimizers.RMSprop(learning_rate=0.001,decay=1e-6)

سوال 5:

با فراخوانی متد fit روی مدل آن را آموزش بدهید. برای سادگی25 ایپاک با سایز بچ 64 بزنید.
به عنوان دیتای validation نیز x_test و y_test را ارسال کنید که در هر سری کارایی روی داده های تست اعلام شود.
In [10]:
 
Train on 50000 samples, validate on 10000 samples
Epoch 1/25
50000/50000 [==============================] - 16s 314us/step - loss: 1.8149 - acc: 0.3340 - val_loss: 1.4958 - val_acc: 0.4657
Epoch 2/25
50000/50000 [==============================] - 12s 238us/step - loss: 1.4985 - acc: 0.4576 - val_loss: 1.4273 - val_acc: 0.4949
Epoch 3/25
50000/50000 [==============================] - 13s 267us/step - loss: 1.3704 - acc: 0.5097 - val_loss: 1.3056 - val_acc: 0.5215
Epoch 4/25
50000/50000 [==============================] - 12s 240us/step - loss: 1.2872 - acc: 0.5429 - val_loss: 1.3538 - val_acc: 0.5080
Epoch 5/25
50000/50000 [==============================] - 12s 240us/step - loss: 1.2318 - acc: 0.5670 - val_loss: 1.1812 - val_acc: 0.5825
Epoch 6/25
50000/50000 [==============================] - 12s 244us/step - loss: 1.1888 - acc: 0.5802 - val_loss: 1.2271 - val_acc: 0.5912
Epoch 7/25
50000/50000 [==============================] - 12s 241us/step - loss: 1.1481 - acc: 0.5959 - val_loss: 1.1042 - val_acc: 0.6139
Epoch 8/25
50000/50000 [==============================] - 12s 240us/step - loss: 1.1248 - acc: 0.6041 - val_loss: 1.1360 - val_acc: 0.5956
Epoch 9/25
50000/50000 [==============================] - 12s 243us/step - loss: 1.0937 - acc: 0.6126 - val_loss: 1.0235 - val_acc: 0.6406
Epoch 10/25
50000/50000 [==============================] - 12s 241us/step - loss: 1.0750 - acc: 0.6232 - val_loss: 1.0030 - val_acc: 0.6523
Epoch 11/25
50000/50000 [==============================] - 12s 240us/step - loss: 1.0486 - acc: 0.6329 - val_loss: 1.0376 - val_acc: 0.6421
Epoch 12/25
50000/50000 [==============================] - 12s 247us/step - loss: 1.0317 - acc: 0.6393 - val_loss: 1.0864 - val_acc: 0.6116
Epoch 13/25
50000/50000 [==============================] - 13s 260us/step - loss: 1.0181 - acc: 0.6450 - val_loss: 0.9765 - val_acc: 0.6542
Epoch 14/25
50000/50000 [==============================] - 13s 250us/step - loss: 1.0019 - acc: 0.6493 - val_loss: 0.9678 - val_acc: 0.6597
Epoch 15/25
50000/50000 [==============================] - 12s 230us/step - loss: 0.9912 - acc: 0.6530 - val_loss: 0.9826 - val_acc: 0.6629
Epoch 16/25
50000/50000 [==============================] - 12s 245us/step - loss: 0.9827 - acc: 0.6549 - val_loss: 1.1734 - val_acc: 0.6110
Epoch 17/25
50000/50000 [==============================] - 12s 240us/step - loss: 0.9739 - acc: 0.6601 - val_loss: 1.1113 - val_acc: 0.6096
Epoch 18/25
50000/50000 [==============================] - 12s 232us/step - loss: 0.9639 - acc: 0.6637 - val_loss: 0.9663 - val_acc: 0.6651
Epoch 19/25
50000/50000 [==============================] - 12s 231us/step - loss: 0.9565 - acc: 0.6670 - val_loss: 0.9510 - val_acc: 0.6765
Epoch 20/25
50000/50000 [==============================] - 11s 229us/step - loss: 0.9474 - acc: 0.6724 - val_loss: 1.0058 - val_acc: 0.6634
Epoch 21/25
50000/50000 [==============================] - 12s 230us/step - loss: 0.9327 - acc: 0.6719 - val_loss: 0.9580 - val_acc: 0.6683
Epoch 22/25
50000/50000 [==============================] - 12s 230us/step - loss: 0.9333 - acc: 0.6719 - val_loss: 0.8680 - val_acc: 0.7061
Epoch 23/25
50000/50000 [==============================] - 11s 229us/step - loss: 0.9240 - acc: 0.6770 - val_loss: 0.9933 - val_acc: 0.6646
Epoch 24/25
50000/50000 [==============================] - 11s 229us/step - loss: 0.9215 - acc: 0.6785 - val_loss: 0.9356 - val_acc: 0.6790
Epoch 25/25
50000/50000 [==============================] - 11s 228us/step - loss: 0.9164 - acc: 0.6819 - val_loss: 0.9316 - val_acc: 0.6818
Out[10]:
<keras.callbacks.History at 0x280000aea20>

سوال 6:

شبکه و هایپرپارامترهای این شبکه را به هر نحوی دوست دارید تغییر دهید تا دقت روی دادگان تست را به حداکثر برسانید.
دوره مقدماتی یادگیری عمیق
علیرضا اخوان پور
پنج شنبه، ۱۸ و ۲۵ بهمن ۱۳۹۷
Class.Vision - AkhavanPour.ir - GitHub
In [ ]: