سنلقي نظرة على بنية 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).
تتفرع الوحدة المبدئية، في النموذج الحالي المقترح، إلى أربعة مسارات مختلفة.
- يتعلم المسار الأول الخصائص المحلية (local features) باستخدام طبقة تلافيفية (convolutional layer) مع مرشحات (filters) 1 × 1.
- يطبق المسار الثاني أولاً تلافيفات (convolutions) 1 × 1 لتقليل الأبعاد (dimensionality reduction). من أجل تحضير المدخلات لتمريرها من خلال تلافيف (convolutions) 3 × 3.
- المسار الثالث هو نفس المسار الثاني. الاختلاف الوحيد بينهما هو أننا نستخدم 5 × 5 تلافيف (convolutions) في هذه المرة. تم تكليف كلاً من الفرعين الثاني والثالث بمعرفة الميزات العامة في الصور.
- يُعرف هذا باسم فرع إسقاط التجمع (pool projection branch). طبقت max pooling 3 × 3 قبل تعلم الميزات باستخدام طبقة تلافيفية (convolutional layer) 1 × 1.
تطبق هذه الفروع العمليات على نفس المدخلات (نفس القيمة، وليس نفس المثال) متوازياً ويتم ربطها لاحقًا. يتم استخدام نفس padding عبر الوحدة النمطية، لضمان إمكانية إجراء تسلسل المخرجات.

يمكننا مشاهدة تمثيل النموذج الأصلي لـ 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)، ويوفر تنظيمًا إضافيًا. تتضمن بنیة هذه الشبكات:
- طبقة average pooling بحجم تجمع 5 × 5 وخطوة (stride) 3.
- طبقة تلافيفية (convolutional layer) 1 × 1 بها 128 مرشحًا (filters) لتقليل الأبعاد (dimensional reduction) وتفعیل خطي مصحح (rectified linear activation).
- طبقة متصلة بالكامل بـ 1024 وحدة وتفعیل خطي مصحح (rectified linear activation).
- dropout بنسبة 70٪ من النواتج.
- طبقة مخرجات تستخدم وظيفة تفعیل softmax لتصنيف شيء (object) إلى فئة من 1000 فئة.

تنفيذ 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)

نقوم ببناء “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)

نحدد الوحدة المبدئية (inception module) المعدلة باستخدام وحدتين conv_modules. فيتم تهيئة الوحدة الأولى باستخدام:
- مرشحات (filters) 1 × 1 (تستخدم لمعرفة الخصائص المحلية (local features) في الصور).
- الثانية والثالثة مع 3 × 3 و 5 × 5 على التوالي (مسؤولة عن تعلم الخصائص العامة (general local features)).
- تحدید طبقة pool projection استخدام طبقة تجمع عالمية (global pooling layer).
- نقوم بعد ذلك، بتجميع مخرجات الطبقة على طول بعد القناة (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
تنفيذ النموذج
- تحدید طبقة إدخال بمعلمات العرض والارتفاع والعمق للدالة.
- استخدام وحدتان المبدئيتين (inception modules) جنبًا إلى جنب مع وحدة الاختزال (downsampling module).
- استخدام خمس وحدات مبدئية مع وحدة الاختزال.
- استخدام الوحدتان المبدئيتين مع الـ pooling والـ dropout.
- طبقة مسطحة (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) في نوع البيانات العائمة.
- سنحسب متوسط كل مجموعة تدریب واختبار من مجموعة البيانات.
- نستخدم ثنائي التسمية (label binarizer) لتحويل التسميات من أعداد صحيحة إلى متجهات.
- نستخدم منشئ بيانات الصورة لإنشاء تباين في البيانات.
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).
- نقوم بتجميع (compile) النموذج باستخدام تکلفة إنتروبيا فئوية (categorical cross-entropy) وضبط المقياس على الدقة.
- نقوم بملاءمة (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، ولكن يمكنك استخدام مجموعات البيانات الخاصة بك لهذا الغرض.
المصادر
This article is useful for me
1+ 5 People like this post