تنفيذ بنیة GoogleNet في Keras باستخدام مجموعة بيانات CIFAR-10

بنیة GoogleNet

سنلقي نظرة على بنية GoogleNet في هذه المقالة، إذ هي نموذج تصنيف للصور قائم على التعلم العميق. ثم نقوم بتنفيذ نسخة مبسطة من GoogleNet في Keras باستخدام مجموعة بيانات CIFAR-10 لهدف التدريب.

ما هي GoogleNet؟

تم تطوير GoogleNet بواسطة فريق بحث Google، وهي عبارة عن شبكة تلافيفية عميقة و 22 طبقة عمیقة (deep layers) لتصنيف الصور (image classification). كان هذا النموذج هو الفائز في ILSRVRC 2014 بمعدل خطأ 6.67٪. إذ حققت أعلى 5 93.3٪ من الدقة في مجموعة بيانات ImageNet بشكل ملحوظ آنذاك.

بنیة ImageNet

بنية النموذج مضغوطة مقارنة بالنماذج الأخرى مثل Alexnet و VGG و Resnet. ويتمثل الاختلاف الرئيسي في هذه البنية في أنها لا تستخدم طبقات كثيفة (dense layers) متعددة ولكنها تستخدم بدلاً من ذلك طبقات تجميع ذات مرشحات (filters) صغيرة. هذا بدوره مع الحفاظ على عمق الشبكة العصبية، يقلل بشكل كبير من الحساب المطلوب. بعبارة أخري، تم تصميم هذا النموذج في بنية خاصة تسمح بزيادة عمق وعرض الشبكة مع الحفاظ على مورد الحوسبة.

شهدت الموجة الجديدة من نماذج تصنيف صور التعلم العميق، استخدام وحدات الشبكة داخل الشبكة. أي أساسيا، استخدام مجموعة من الطبقات المحددة مسبقًا (في شكل وظيفة) والتي تم تجربتها واختبارها بالفعل لتحسين التدريب أو جعل النموذج فاعلاً، مما يجعل نموذج GoogleNet متعدد الاستخدامات. ويستخدم وحدة شبكة داخل الشبكة التي تسمى الوحدة المبدئية (inception module).

يأخذ النموذج الأصلي صورًا بحجم 3×224×224 كمدخلات، ويحتوي على مرشحات تتراوح من 1 × 1 إلى 5 × 5، وتفعیل ReLU للطبقات التلافيفية (convolutional layers)، وطبقات التسرب (dropout layers) من أجل التنظيم (regularization).

الوحدة المبدئية (Inception Module)

الفكرة العامة وراء الوحدة المبدئية (inception module) هي إنشاء بنية ما، إذ يمكن تمرير المدخلات من خلال أنواع مختلفة من الطبقات في وقت واحد. من أجل استخراج الخصائص المميزة (distinct features) متوازيا، ثم ربطها لاحقا. يتم ذلك حتى يتمكن النموذج من تعلم الميزات المحلية والمجردة والتي بدورها تعزز أداء النموذج (model performance).

تتفرع الوحدة المبدئية، في النموذج الحالي المقترح، إلى أربعة مسارات مختلفة.

  1. يتعلم المسار الأول الخصائص المحلية (local features) باستخدام طبقة تلافيفية (convolutional layer) مع مرشحات (filters) 1 × 1.
  2. يطبق المسار الثاني أولاً تلافيفات (convolutions) 1 × 1 لتقليل الأبعاد (dimensionality reduction). من أجل تحضير المدخلات لتمريرها من خلال تلافيف (convolutions) 3 × 3.
  3. المسار الثالث هو نفس المسار الثاني. الاختلاف الوحيد بينهما هو أننا نستخدم 5 × 5 تلافيف (convolutions) في هذه المرة. تم تكليف كلاً من الفرعين الثاني والثالث بمعرفة الميزات العامة في الصور.
  4. يُعرف هذا باسم فرع إسقاط التجمع (pool projection branch). طبقت max pooling 3 × 3 قبل تعلم الميزات باستخدام طبقة تلافيفية (convolutional layer) 1 × 1.

تطبق هذه الفروع العمليات على نفس المدخلات (نفس القيمة، وليس نفس المثال) متوازياً ويتم ربطها لاحقًا. يتم استخدام نفس padding عبر الوحدة النمطية، لضمان إمكانية إجراء تسلسل المخرجات.

تنفيذ بنیة GoogleNet في Keras

يمكننا مشاهدة تمثيل النموذج الأصلي لـ ImageNet أدناه:

  • حجم الصورة المدخل هي 224 × 224.
  • هناك تسع وحدات مبدئية (inception module) للشبكة هذه.
  • توجد أربع طبقات للـ max-pooling خارج الوحدة المبدئية (inception module)، حيث توجد طبقتان بين المربع 3-4 والمربع 7-8. تساعد طبقات max-pooling هذه على تقليل حجم بيانات الإدخال، وبالتالي تقليل تعقيد النموذج بالإضافة إلى التكلفة الحسابية (computational cost).
  • ترث هذه الشبكة فكرة استخدام طبقة average pooling من NiN، مما يساعد على تحسين أداء النموذج وتقليل الـ overfitting.
  • يتم استخدام طبقة dropout (بنسبة 40٪) قبل الطبقة الخطية (linear layer). تعد هذه أيضًا طريقة تنظيم (regularization) فاعلة لتقليل ظاهرة overfitting.
  • تستخدم طبقة المخرجات وظيفة تفعیل softmax لإعطاء 1000 إخراج يتوافق مع عدد الفئات في مجموعة بيانات ImageNet.

إلى جانب ذلك، تمت إضافة بعض الشبكات الإضافية على جانب، مما يشجع على التمييز في المراحل الأدنى في المصنف، ويزيد من إشارة التدرج (gradient signal) التي تحصل على الانتشار العكسي (backpropagation)، ويوفر تنظيمًا إضافيًا. تتضمن بنیة هذه الشبكات:

  1. طبقة average pooling بحجم تجمع 5 × 5 وخطوة (stride) 3.
  2. طبقة تلافيفية (convolutional layer) 1 × 1 بها 128 مرشحًا (filters) لتقليل الأبعاد (dimensional reduction) وتفعیل خطي مصحح (rectified linear activation).
  3. طبقة متصلة بالكامل بـ 1024 وحدة وتفعیل خطي مصحح (rectified linear activation).
  4. dropout بنسبة 70٪ من النواتج.
  5. طبقة مخرجات تستخدم وظيفة تفعیل softmax لتصنيف شيء (object) إلى فئة من 1000 فئة.
تنفيذ بنیة GoogleNet في Keras

تنفيذ GoogLeNet باستخدام Keras

نحتاج أولاً، استيراد بعض المكتبات الضرورية:

from keras.layers.normalization import BatchNormalization
from keras.layers.convolutional import Conv2D
from keras.layers.convolutional import AveragePooling2D
from keras.layers.convolutional import MaxPooling2D
from keras.layers.core import Activation
from keras.layers.core import Dropout
from keras.layers.core import Dense
from keras.layers import Flatten
from keras.layers import Input
from keras.models import Model
from keras.layers import concatenate
import matplotlib
matplotlib.use("Agg")
%matplotlib inline
from sklearn.preprocessing import LabelBinarizer
from keras.preprocessing.image import ImageDataGenerator
from keras.callbacks import LearningRateScheduler
from keras.optimizers import SGD
from keras.datasets import cifar10
import numpy as np

تنفيذ الوحدة التلافيفية (Convolutional Module)

تنفيذ بنیة GoogleNet في Keras

نقوم ببناء “conv_module” وهي سلسلة من طبقات التلافيف وطبقة تسوية دفعية (batch normalization layer) يتم تمريرها في النهاية من خلال تفعیل Relu.

def conv_module(input,No_of_filters,filtersizeX,filtersizeY,stride,chanDim,padding="same"):
  input = Conv2D(No_of_filters,(filtersizeX,filtersizeY),strides=stride,padding=padding)(input)
  input = BatchNormalization(axis=chanDim)(input)
  input = Activation("relu")(input)
  return input

الحجج (arguments):

الإدخال: المدخلات المراد معالجتها

عدد المرشحات (filters): عدد المرشحات التي يجب أن تكون في طبقة Conv2D.

FilterX و FilterY: حجم المرشحات.

خطوة (stride)

أبعاد القناة (channel dimension)

Padding: مُعرَّفة مسبقًا بـ ” same” للنموذج بأكمله.

تنفيذ الوحدة المبدئية (inception module)

تنفيذ بنیة GoogleNet في Keras

نحدد الوحدة المبدئية (inception module) المعدلة باستخدام وحدتين conv_modules. فيتم تهيئة الوحدة الأولى باستخدام:

  1. مرشحات (filters) 1 × 1 (تستخدم لمعرفة الخصائص المحلية (local features) في الصور).
  2. الثانية والثالثة مع 3 × 3 و 5 × 5 على التوالي (مسؤولة عن تعلم الخصائص العامة (general local features)).
  3. تحدید طبقة pool projection استخدام طبقة تجمع عالمية (global pooling layer).
  4. نقوم بعد ذلك، بتجميع مخرجات الطبقة على طول بعد القناة (channel) (chanDim).
def inception_module(input,numK1x1,numK3x3,numk5x5,numPoolProj,chanDim):
                                 #Step 1
  conv_1x1 = conv_module(input, numK1x1, 1, 1,(1, 1), chanDim) 
                                 #Step 2
  conv_3x3 = conv_module(input, numK3x3, 3, 3,(1, 1), chanDim)
  conv_5x5 = conv_module(input, numk5x5, 5, 5,(1, 1), chanDim)
                                 #Step 3
  pool_proj = MaxPooling2D((3, 3), strides=(1, 1), padding='same')(input)
  pool_proj = Conv2D(numPoolProj, (1, 1), padding='same', activation='relu')(pool_proj)
                                 #Step 4
  input = concatenate([conv_1x1, conv_3x3, conv_5x5, pool_proj], axis=chanDim)
  return input

تنفيذ وحدة الاختزال (Downsample Module)

كما يمكن أن نرى في البنیة التي من المفترض أن تكون مبنية فوق النموذج فهي عميقة جدًا. وبالتالي فإنه يتطلب الاختزال (downsample)، إذ يمكن التحكم في عدد المعلمات (parameters) القابلة للتدريب. نستخدم لهذه الدالة، downsample_module صغيرة. فإنها في الأساس، عبارة عن سلسلة من مخرجات طبقة الـ max-pooling و conv_module (مع مرشحات (filters) 3 × 3).

def downsample_module(input,No_of_filters,chanDim):
  conv_3x3=conv_module(input,No_of_filters,3,3,(2,2),chanDim,padding="valid")
  pool = MaxPooling2D((3,3),strides=(2,2))(input)
  input = concatenate([conv_3x3,pool],axis=chanDim)
  return input

تنفيذ النموذج

  1. تحدید طبقة إدخال بمعلمات العرض والارتفاع والعمق للدالة.
  2. استخدام وحدتان المبدئيتين (inception modules) جنبًا إلى جنب مع وحدة الاختزال (downsampling module).
  3. استخدام خمس وحدات مبدئية مع وحدة الاختزال.
  4. استخدام الوحدتان المبدئيتين مع الـ pooling والـ dropout.
  5. طبقة مسطحة (Flatten layer)، ذات طبقة كثيفة (dense layer) (مع عدم وجود وحدات متساوية لعدد الفئات) إلى جانب طبقة تفعیل مع تصنيف softmax.
def MiniGoogleNet(width,height,depth,classes):
  inputShape=(height,width,depth)
  chanDim=-1

  # (Step 1) Define the model input
  inputs = Input(shape=inputShape)

  # First CONV module
  x = conv_module(inputs, 96, 3, 3, (1, 1),chanDim)

  # (Step 2) Two Inception modules followed by a downsample module
  x = inception_module(x, 32, 32,32,32,chanDim)
  x = inception_module(x, 32, 48, 48,32,chanDim)
  x = downsample_module(x, 80, chanDim)
  
  # (Step 3) Five Inception modules followed by a downsample module
  x = inception_module(x, 112, 48, 32, 48,chanDim)
  x = inception_module(x, 96, 64, 32,32,chanDim)
  x = inception_module(x, 80, 80, 32,32,chanDim)
  x = inception_module(x, 48, 96, 32,32,chanDim)
  x = inception_module(x, 112, 48, 32, 48,chanDim)
  x = downsample_module(x, 96, chanDim)

  # (Step 4) Two Inception modules followed
  x = inception_module(x, 176, 160,96,96, chanDim)
  x = inception_module(x, 176, 160, 96,96,chanDim)
  
  # Global POOL and dropout
  x = AveragePooling2D((7, 7))(x)
  x = Dropout(0.5)(x)

  # (Step 5) Softmax classifier
  x = Flatten()(x)
  x = Dense(classes)(x)
  x = Activation("softmax")(x)

  # Create the model
  model = Model(inputs, x, name="googlenet")
  return model

يمكنك إلقاء نظرة على بنية النموذج عن طريق إنشاء مثيل نموذج واستخدامها مع دالة التلخيص.

الإخراج:

Model: "googlenet" 
__________________________________________________________________________________________________ 
Layer (type)                    Output Shape         Param #  Connected to 
================================================================================================== 
input_1 (InputLayer)            [(None, 32, 32, 3)]  0 
__________________________________________________________________________________________________ 
conv2d (Conv2D)                 (None, 32, 32, 96)   2688     input_1[0][0] 
__________________________________________________________________________________________________ 
batch_normalization (BatchNorma (None, 32, 32, 96)   384      conv2d[0][0] 
__________________________________________________________________________________________________ 
activation (Activation)         (None, 32, 32, 96)   0        batch_normalization[0][0] 
__________________________________________________________________________________________________ 
conv2d_1 (Conv2D)               (None, 32, 32, 32)   3104     activation[0][0] 
__________________________________________________________________________________________________ 
conv2d_2 (Conv2D)               (None, 32, 32, 32)   27680    activation[0][0] 
__________________________________________________________________________________________________ 
conv2d_3 (Conv2D)               (None, 32, 32, 32)   76832    activation[0][0] 
__________________________________________________________________________________________________ 
batch_normalization_1 (BatchNor (None, 32, 32, 32)   128      conv2d_1[0][0] 
__________________________________________________________________________________________________ 
batch_normalization_2 (BatchNor (None, 32, 32, 32)   128      conv2d_2[0][0] 
__________________________________________________________________________________________________ 
batch_normalization_3 (BatchNor (None, 32, 32, 32)   128      conv2d_3[0][0] 
__________________________________________________________________________________________________ 
max_pooling2d (MaxPooling2D)    (None, 32, 32, 96)   0        activation[0][0] 
__________________________________________________________________________________________________ 
activation_1 (Activation)       (None, 32, 32, 32)   0        batch_normalization_1[0][0] 
__________________________________________________________________________________________________ 
activation_2 (Activation)       (None, 32, 32, 32)   0        batch_normalization_2[0][0] 
__________________________________________________________________________________________________ 
activation_3 (Activation)       (None, 32, 32, 32)   0        batch_normalization_3[0][0] 
__________________________________________________________________________________________________ 
conv2d_4 (Conv2D)               (None, 32, 32, 32)   3104     max_pooling2d[0][0] 
__________________________________________________________________________________________________ 
concatenate (Concatenate)       (None, 32, 32, 128)  0        activation_1[0][0] activation_2[0][0] activation_3[0][0] conv2d_4[0][0] 
__________________________________________________________________________________________________ 
conv2d_5 (Conv2D)               (None, 32, 32, 32)   4128     concatenate[0][0] 
__________________________________________________________________________________________________ 
conv2d_6 (Conv2D)               (None, 32, 32, 48)   55344    concatenate[0][0] 
__________________________________________________________________________________________________ 
conv2d_7 (Conv2D)               (None, 32, 32, 48)   153648   concatenate[0][0] 
__________________________________________________________________________________________________ 
batch_normalization_4 (BatchNor (None, 32, 32, 32)   128      conv2d_5[0][0] 
__________________________________________________________________________________________________ 
batch_normalization_5 (BatchNor (None, 32, 32, 48)   192      conv2d_6[0][0] 
__________________________________________________________________________________________________ 
batch_normalization_6 (BatchNor (None, 32, 32, 48)   192      conv2d_7[0][0] 
__________________________________________________________________________________________________ 
max_pooling2d_1 (MaxPooling2D)  (None, 32, 32, 128)  0        concatenate[0][0] 
__________________________________________________________________________________________________ 
activation_4 (Activation)       (None, 32, 32, 32)   0        batch_normalization_4[0][0] 
__________________________________________________________________________________________________ 
activation_5 (Activation)       (None, 32, 32, 48)   0        batch_normalization_5[0][0] 
__________________________________________________________________________________________________ 
activation_6 (Activation)       (None, 32, 32, 48)   0        batch_normalization_6[0][0] 
__________________________________________________________________________________________________ 
conv2d_8 (Conv2D)               (None, 32, 32, 32)   4128     max_pooling2d_1[0][0] 
__________________________________________________________________________________________________ 
concatenate_1 (Concatenate)     (None, 32, 32, 160)  0        activation_4[0][0] activation_5[0][0] activation_6[0][0] conv2d_8[0][0] 
__________________________________________________________________________________________________ 
conv2d_9 (Conv2D)               (None, 15, 15, 80)   115280   concatenate_1[0][0] 
__________________________________________________________________________________________________ 
batch_normalization_7 (BatchNor (None, 15, 15, 80)   320      conv2d_9[0][0] 
__________________________________________________________________________________________________ 
activation_7 (Activation)       (None, 15, 15, 80)   0        batch_normalization_7[0][0] 
__________________________________________________________________________________________________ 
max_pooling2d_2 (MaxPooling2D)  (None, 15, 15, 160)  0        concatenate_1[0][0] 
__________________________________________________________________________________________________ 
concatenate_2 (Concatenate)     (None, 15, 15, 240)  0        activation_7[0][0] max_pooling2d_2[0][0] 
__________________________________________________________________________________________________ 
conv2d_10 (Conv2D)              (None, 15, 15, 112)  26992    concatenate_2[0][0] 
__________________________________________________________________________________________________ 
conv2d_11 (Conv2D)              (None, 15, 15, 48)   103728   concatenate_2[0][0] 
__________________________________________________________________________________________________ 
conv2d_12 (Conv2D)              (None, 15, 15, 32)   192032   concatenate_2[0][0] 
__________________________________________________________________________________________________ 
batch_normalization_8 (BatchNor (None, 15, 15, 112)  448      conv2d_10[0][0] 
__________________________________________________________________________________________________ 
batch_normalization_9 (BatchNor (None, 15, 15, 48)   192      conv2d_11[0][0] 
__________________________________________________________________________________________________ 
batch_normalization_10 (BatchNo (None, 15, 15, 32)   128      conv2d_12[0][0] 
__________________________________________________________________________________________________ 
max_pooling2d_3 (MaxPooling2D)  (None, 15, 15, 240)  0        concatenate_2[0][0] 
__________________________________________________________________________________________________ 
activation_8 (Activation)       (None, 15, 15, 112)  0        batch_normalization_8[0][0] 
__________________________________________________________________________________________________ 
activation_9 (Activation)       (None, 15, 15, 48)   0        batch_normalization_9[0][0] 
__________________________________________________________________________________________________ 
activation_10 (Activation)      (None, 15, 15, 32)   0        batch_normalization_10[0][0] 
__________________________________________________________________________________________________ 
conv2d_13 (Conv2D)              (None, 15, 15, 48)   11568    max_pooling2d_3[0][0] 
__________________________________________________________________________________________________ 
concatenate_3 (Concatenate)     (None, 15, 15, 240)  0        activation_8[0][0] activation_9[0][0] activation_10[0][0] conv2d_13[0][0] 
__________________________________________________________________________________________________ 
conv2d_14 (Conv2D)              (None, 15, 15, 96)   23136    concatenate_3[0][0] 
__________________________________________________________________________________________________ 
conv2d_15 (Conv2D)              (None, 15, 15, 64)   138304   concatenate_3[0][0] 
__________________________________________________________________________________________________ 
conv2d_16 (Conv2D)              (None, 15, 15, 32)   192032   concatenate_3[0][0] 
__________________________________________________________________________________________________ 
batch_normalization_11 (BatchNo (None, 15, 15, 96)   384      conv2d_14[0][0] 
__________________________________________________________________________________________________ 
batch_normalization_12 (BatchNo (None, 15, 15, 64)   256      conv2d_15[0][0] 
__________________________________________________________________________________________________ 
batch_normalization_13 (BatchNo (None, 15, 15, 32)   128      conv2d_16[0][0] 
__________________________________________________________________________________________________ 
max_pooling2d_4 (MaxPooling2D)  (None, 15, 15, 240)  0        concatenate_3[0][0] 
__________________________________________________________________________________________________ 
activation_11 (Activation)      (None, 15, 15, 96)   0        batch_normalization_11[0][0] 
__________________________________________________________________________________________________ 
activation_12 (Activation)      (None, 15, 15, 64)   0        batch_normalization_12[0][0] 
__________________________________________________________________________________________________ 
activation_13 (Activation)      (None, 15, 15, 32)   0        batch_normalization_13[0][0] 
__________________________________________________________________________________________________ 
conv2d_17 (Conv2D)              (None, 15, 15, 32)   7712     max_pooling2d_4[0][0] 
__________________________________________________________________________________________________ 
concatenate_4 (Concatenate)     (None, 15, 15, 224)  0        activation_11[0][0] activation_12[0][0] activation_13[0][0] conv2d_17[0][0] 
__________________________________________________________________________________________________ 
conv2d_18 (Conv2D)              (None, 15, 15, 80)   18000    concatenate_4[0][0] 
__________________________________________________________________________________________________ 
conv2d_19 (Conv2D)              (None, 15, 15, 80)   161360   concatenate_4[0][0] 
__________________________________________________________________________________________________ 
conv2d_20 (Conv2D)              (None, 15, 15, 32)   179232   concatenate_4[0][0] 
__________________________________________________________________________________________________ 
batch_normalization_14 (BatchNo (None, 15, 15, 80)   320      conv2d_18[0][0] 
__________________________________________________________________________________________________ 
batch_normalization_15 (BatchNo (None, 15, 15, 80)   320      conv2d_19[0][0] 
__________________________________________________________________________________________________ 
batch_normalization_16 (BatchNo (None, 15, 15, 32)   128      conv2d_20[0][0] 
__________________________________________________________________________________________________ 
max_pooling2d_5 (MaxPooling2D)  (None, 15, 15, 224)  0        concatenate_4[0][0] 
__________________________________________________________________________________________________ 
activation_14 (Activation)      (None, 15, 15, 80)   0        batch_normalization_14[0][0] 
__________________________________________________________________________________________________ 
activation_15 (Activation)      (None, 15, 15, 80)   0        batch_normalization_15[0][0] 
__________________________________________________________________________________________________ 
activation_16 (Activation)      (None, 15, 15, 32)   0        batch_normalization_16[0][0] 
__________________________________________________________________________________________________ 
conv2d_21 (Conv2D)              (None, 15, 15, 32)   7200     max_pooling2d_5[0][0] 
__________________________________________________________________________________________________ 
concatenate_5 (Concatenate)     (None, 15, 15, 224)  0        activation_14[0][0] activation_15[0][0] activation_16[0][0] conv2d_21[0][0] 
__________________________________________________________________________________________________ 
conv2d_22 (Conv2D)              (None, 15, 15, 48)   10800    concatenate_5[0][0] 
__________________________________________________________________________________________________ 
conv2d_23 (Conv2D)              (None, 15, 15, 96)   193632   concatenate_5[0][0] 
__________________________________________________________________________________________________ 
conv2d_24 (Conv2D)              (None, 15, 15, 32)   179232   concatenate_5[0][0] 
__________________________________________________________________________________________________ 
batch_normalization_17 (BatchNo (None, 15, 15, 48)   192      conv2d_22[0][0] 
__________________________________________________________________________________________________ 
batch_normalization_18 (BatchNo (None, 15, 15, 96)   384      conv2d_23[0][0] 
__________________________________________________________________________________________________ 
batch_normalization_19 (BatchNo (None, 15, 15, 32)   128      conv2d_24[0][0] 
__________________________________________________________________________________________________ 
max_pooling2d_6 (MaxPooling2D)  (None, 15, 15, 224)  0        concatenate_5[0][0] 
__________________________________________________________________________________________________ 
activation_17 (Activation)      (None, 15, 15, 48)   0        batch_normalization_17[0][0] 
__________________________________________________________________________________________________ 
activation_18 (Activation)      (None, 15, 15, 96)   0        batch_normalization_18[0][0] 
__________________________________________________________________________________________________ 
activation_19 (Activation)      (None, 15, 15, 32)   0        batch_normalization_19[0][0] 
__________________________________________________________________________________________________ 
conv2d_25 (Conv2D)              (None, 15, 15, 32)   7200     max_pooling2d_6[0][0] 
__________________________________________________________________________________________________ 
concatenate_6 (Concatenate)     (None, 15, 15, 208)  0        activation_17[0][0] activation_18[0][0] activation_19[0][0] conv2d_25[0][0] 
__________________________________________________________________________________________________ 
conv2d_26 (Conv2D)              (None, 15, 15, 112)  23408    concatenate_6[0][0] 
__________________________________________________________________________________________________ 
conv2d_27 (Conv2D)              (None, 15, 15, 48)   89904    concatenate_6[0][0] 
__________________________________________________________________________________________________ 
conv2d_28 (Conv2D)              (None, 15, 15, 32)   166432   concatenate_6[0][0] 
__________________________________________________________________________________________________ 
batch_normalization_20 (BatchNo (None, 15, 15, 112)  448      conv2d_26[0][0] 
__________________________________________________________________________________________________ 
batch_normalization_21 (BatchNo (None, 15, 15, 48)   192      conv2d_27[0][0] 
__________________________________________________________________________________________________ 
batch_normalization_22 (BatchNo (None, 15, 15, 32)   128      conv2d_28[0][0] 
__________________________________________________________________________________________________ 
max_pooling2d_7 (MaxPooling2D)  (None, 15, 15, 208)  0        concatenate_6[0][0] 
__________________________________________________________________________________________________ 
activation_20 (Activation)      (None, 15, 15, 112)  0        batch_normalization_20[0][0] 
__________________________________________________________________________________________________ 
activation_21 (Activation)      (None, 15, 15, 48)   0        batch_normalization_21[0][0] 
__________________________________________________________________________________________________ 
activation_22 (Activation)      (None, 15, 15, 32)   0        batch_normalization_22[0][0] 
__________________________________________________________________________________________________ 
conv2d_29 (Conv2D)              (None, 15, 15, 48)   10032    max_pooling2d_7[0][0] 
__________________________________________________________________________________________________ 
concatenate_7 (Concatenate)     (None, 15, 15, 240)  0        activation_20[0][0] activation_21[0][0] activation_22[0][0] conv2d_29[0][0] 
__________________________________________________________________________________________________ 
conv2d_30 (Conv2D)              (None, 7, 7, 96)     207456   concatenate_7[0][0] 
__________________________________________________________________________________________________ 
batch_normalization_23 (BatchNo (None, 7, 7, 96)     384      conv2d_30[0][0] 
__________________________________________________________________________________________________ 
activation_23 (Activation)      (None, 7, 7, 96)     0        batch_normalization_23[0][0] 
__________________________________________________________________________________________________ 
max_pooling2d_8 (MaxPooling2D)  (None, 7, 7, 240)    0        concatenate_7[0][0] 
__________________________________________________________________________________________________ 
concatenate_8 (Concatenate)     (None, 7, 7, 336)    0        activation_23[0][0] max_pooling2d_8[0][0] 
__________________________________________________________________________________________________ 
conv2d_31 (Conv2D)              (None, 7, 7, 176)    59312    concatenate_8[0][0] 
__________________________________________________________________________________________________ 
conv2d_32 (Conv2D)              (None, 7, 7, 160)    484000   concatenate_8[0][0] 
__________________________________________________________________________________________________ 
conv2d_33 (Conv2D)              (None, 7, 7, 96)     806496   concatenate_8[0][0] 
__________________________________________________________________________________________________ 
batch_normalization_24 (BatchNo (None, 7, 7, 176)    704      conv2d_31[0][0] 
__________________________________________________________________________________________________ 
batch_normalization_25 (BatchNo (None, 7, 7, 160)    640      conv2d_32[0][0] 
__________________________________________________________________________________________________ 
batch_normalization_26 (BatchNo (None, 7, 7, 96)     384      conv2d_33[0][0] 
__________________________________________________________________________________________________ 
max_pooling2d_9 (MaxPooling2D)  (None, 7, 7, 336)    0        concatenate_8[0][0] 
__________________________________________________________________________________________________ 
activation_24 (Activation)      (None, 7, 7, 176)    0        batch_normalization_24[0][0] 
__________________________________________________________________________________________________ 
activation_25 (Activation)      (None, 7, 7, 160)    0        batch_normalization_25[0][0] 
__________________________________________________________________________________________________ 
activation_26 (Activation)      (None, 7, 7, 96)     0        batch_normalization_26[0][0] 
__________________________________________________________________________________________________ 
conv2d_34 (Conv2D)              (None, 7, 7, 96)     32352    max_pooling2d_9[0][0] 
__________________________________________________________________________________________________ 
concatenate_9 (Concatenate)     (None, 7, 7, 528)    0        activation_24[0][0] activation_25[0][0] activation_26[0][0] conv2d_34[0][0] 
__________________________________________________________________________________________________ 
conv2d_35 (Conv2D)              (None, 7, 7, 176)    93104    concatenate_9[0][0] 
__________________________________________________________________________________________________ 
conv2d_36 (Conv2D)              (None, 7, 7, 160)    760480   concatenate_9[0][0] 
__________________________________________________________________________________________________ 
conv2d_37 (Conv2D)              (None, 7, 7, 96)     1267296  concatenate_9[0][0] 
__________________________________________________________________________________________________ 
batch_normalization_27 (BatchNo (None, 7, 7, 176)    704      conv2d_35[0][0] 
__________________________________________________________________________________________________ 
batch_normalization_28 (BatchNo (None, 7, 7, 160)    640      conv2d_36[0][0] 
__________________________________________________________________________________________________ 
batch_normalization_29 (BatchNo (None, 7, 7, 96)     384      conv2d_37[0][0] 
__________________________________________________________________________________________________ 
max_pooling2d_10 (MaxPooling2D) (None, 7, 7, 528)    0        concatenate_9[0][0] 
__________________________________________________________________________________________________ 
activation_27 (Activation)      (None, 7, 7, 176)    0        batch_normalization_27[0][0] 
__________________________________________________________________________________________________ 
activation_28 (Activation)      (None, 7, 7, 160)    0        batch_normalization_28[0][0] 
__________________________________________________________________________________________________ 
activation_29 (Activation)      (None, 7, 7, 96)     0        batch_normalization_29[0][0] 
__________________________________________________________________________________________________ 
conv2d_38 (Conv2D)              (None, 7, 7, 96)     50784    max_pooling2d_10[0][0] 
__________________________________________________________________________________________________ 
concatenate_10 (Concatenate)    (None, 7, 7, 528)    0        activation_27[0][0] activation_28[0][0] activation_29[0][0] conv2d_38[0][0] 
__________________________________________________________________________________________________ 
average_pooling2d (AveragePooli (None, 1, 1, 528)    0        concatenate_10[0][0] 
__________________________________________________________________________________________________ 
dropout (Dropout)               (None, 1, 1, 528)    0        average_pooling2d[0][0] 
__________________________________________________________________________________________________ 
flatten (Flatten)               (None, 528)          0        dropout[0][0] 
__________________________________________________________________________________________________ 
dense (Dense)                   (None, 10)           5290     flatten[0][0] 
__________________________________________________________________________________________________ 
activation_30 (Activation)      (None, 10)           0        dense[0][0] 
================================================================================================== 
Total params: 5,963,658 
Trainable params: 5,959,050 
Non-trainable params: 4,608 
__________________________________________________________________________________________________ 
None

أعداد البيانات

سنقوم بتحميل مجموعة بيانات CIFAR كمصفوفات (arrays) في نوع البيانات العائمة.

  1. سنحسب متوسط كل مجموعة تدریب واختبار من مجموعة البيانات.
  2. نستخدم ثنائي التسمية (label binarizer) لتحويل التسميات من أعداد صحيحة إلى متجهات.
  3. نستخدم منشئ بيانات الصورة لإنشاء تباين في البيانات.
NUM_EPOCHS = 50
INIT_LR = 5e-3
def poly_decay(epoch):
  maxEpochs = NUM_EPOCHS
  baseLR = INIT_LR
  power = 1.0
  alpha = baseLR * (1 - (epoch / float(maxEpochs))) ** power
  return alpha

((trainX, trainY), (testX, testY)) = cifar10.load_data()
trainX = trainX.astype("float")
testX = testX.astype("float")
                                # Step 1
mean = np.mean(trainX, axis=0)
trainX -= mean
testX -= mean
                                # Step 2
lb = LabelBinarizer()
trainY = lb.fit_transform(trainY)
testY = lb.transform(testY)
                                # Step 3
aug = ImageDataGenerator(width_shift_range=0.1,height_shift_range=0.1, horizontal_flip=True,fill_mode="nearest")

compiling و fitting النموذج

تحديد عمليات الاسترجاعات والمحسنات (optimizers) للنموذج. سنقوم بإنشاء مثيل نموذج باستخدام حجج (arguments) العرض والارتفاع والعمق والفئات (32،32،3،10).

  1. نقوم بتجميع (compile) النموذج باستخدام تکلفة إنتروبيا فئوية (categorical cross-entropy) وضبط المقياس على الدقة.
  2. نقوم بملاءمة (fit) النموذج مع منشئ البيانات، وبيانات التحقق (validation data)، والخطوات في كل حقبة، وعدد الحقب، وعمليات الاسترجاعات.
callbacks=[LearningRateScheduler(poly_decay)]
opt = SGD(lr=INIT_LR, momentum=0.9)
model = GoogleNet(width=32, height=32, depth=3, classes=10)
                                    # Step 1
model.compile(loss="categorical_crossentropy", optimizer=opt,metrics=["accuracy"])
                                    # Step 2
model.fit(aug.flow(trainX, trainY, batch_size=64),validation_data=(testX, testY), steps_per_epoch=len(trainX) // 64,epochs=NUM_EPOCHS, callbacks=callbacks, verbose=1)

الإخراج:

الحقبة الأخيرة:

# Final epoch
Epoch 50/50 781/781 [==============================] - 103s 132ms/step - loss: 0.0211 - accuracy: 0.9939 - val_loss: 0.3649 - val_accuracy: 0.9085

تقييم النموذج (module evaluation)

نستخدم الكود أدناه، للتحقق من دقة الاختبار. سيكون الإخراج حوالي 90 في المئة.

score=model.evaluate(testX,testY)
print('Test Score=',score[0])
print('Test Accuracy=',score[1])

الإخراج:

Test Score: 0.3751
Test Accuracy: 0.9077

الاستنتاج

وصلنا إلى نهاية هذه المقالة التعليمية، إذ قمنا خلالها بتنفيذ GoogleNet في Keras والتدريب باستخدام مجموعة بيانات CIFAR-10، ولكن يمكنك استخدام مجموعات البيانات الخاصة بك لهذا الغرض.

المصادر

الأول
الثاني

منشور ذات صلة
تقنیة t-SNE 6 Minutes

بسط تقنیة t-SNE وتنفیذها في بایثون

حسن خنفري

على عكس PCA، أحد تقنيات تقليل الأبعاد الشائعة الاستخدام، فإن tSNE هي تقنية غير خطية واحتمالية. ما يعنيه هذا أن tSNE يمكنه التقاط نمط غير خطي في البيانات. نظرًا لأنه احتمالي، فقد لا تحصل على نفس النتيجة لنفس البيانات.

اترك تعليقاً

لن يتم نشر عنوان بريدك الإلكتروني. الحقول الإلزامية مشار إليها بـ *

السلة