الدماغ من الداخل (تصور مرور النموذج من خلال نموذج الشبكة العصبية الاصطناعية)

مقدمة


هذه المقالة مخصصة لأولئك الذين أبدوا أي اهتمام في مسألة ما يحدث داخل الشبكة العصبية الاصطناعية ( ANN) . يمكن للجميع الآن تطوير شبكة ANN الخاصة بهم باستخدام المكتبات الجاهزة المتوفرة في معظم لغات البرمجة. في هذه المقالة ، سأحاول إظهار كيف يبدو الكائن ( Pattern ) تمامًا ، ويمر عبر طبقات ANN ، التي تم تطويرها وتجميعها باستخدام مكتبة Tensorflow للتعلم العميق مع وظيفة Keras الإضافية.

البرامج المستخدمة


المكونات التالية مطلوبة (الإصدارات التي حددتها لحالتي):

  • tensorflow 1.10.0
  • keras 2.2.4
  • matplotlib 2.2.0
  • modul-os
  • numpy1.14.3

من الممكن أيضًا رسم بنية الشبكة ، ولكن من الضروري تثبيت أدوات التصور ، في حالتي تم استخدام keras وفي الطريقة

PLOT_PATTERN_PROCCESS(...) 

لتأسيس

PLOT_MODEL = صحيح


 def PLOT_PATTERN_PROCCESS(model, pattern, FOLDER_TO_SAVE, grid_size=(3, 3), limit_size_layer=(15, 15), PLOT_MODEL=True): 

الصورة

الفكرة الرئيسية


من الضروري اختيار نمط واحد (المقطع الذي سنلاحظه) ، وبعد تحديده ، يتم تقسيم الشبكة إلى طبقات متوترة . في دورة من الثانية إلى آخر طبقة ، يتم إنشاء شبكة جديدة ، حيث يكون الناتج هو رقم الطبقة في الدورة ، وتخطي النموذج ، والنتيجة هي صفيف أبعاد n في إخراج الشبكة.

التنفيذ


ربط المكتبات

 from keras.models import * from keras.layers import * import matplotlib.pyplot as plt import os import numpy as np 

الأساليب المستخدمة:

  • def PLOT_PATTERN_PROCCESS (النموذج ، النموذج ، FOLDER_TO_SAVE ، grid_size = (3 ، 3) ، limit_size_layer = (15 ، 15) ، PLOT_MODEL = صواب):
     def PLOT_PATTERN_PROCCESS(model, pattern, FOLDER_TO_SAVE, grid_size=(3, 3), limit_size_layer=(15, 15), PLOT_MODEL=True): """ :param model:   keras :type model: Sequential :param pattern:  ,       :type pattern: np.array :param FOLDER_TO_SAVE:       :type FOLDER_TO_SAVE: str :param grid_size:     :type grid_size: tuple :param limit_size_layer:      :type limit_size_layer: tuple :param PLOT_MODEL:    :type PLOT_MODEL: PLOT_MODEL """ SAVE_AR_LIST = [] for num_layer in range(1, len(model.layers)): LO = model.layers[num_layer].output _model = Model(inputs=model.input, outputs=LO) if ( len(_model.output_shape) == 3 and _model.output_shape[1] > limit_size_layer[0] and _model.output_shape[2] > limit_size_layer[1] ): _output = _model.predict(pattern)[0] SAVE_AR_LIST.append( [ num_layer, model.layers[num_layer].name, _output.tolist() ] ) ### PIC_NUM = 0 while len(SAVE_AR_LIST) > 0: fig, axs = plt.subplots(nrows=grid_size[0], ncols=grid_size[1], figsize=(10, 10), tight_layout=True) xmin, xmax = plt.xlim() ymin, ymax = plt.ylim() for ax in axs.flat: [num_layer, layer_name, ar] = SAVE_AR_LIST.pop(0) ax.imshow(np.array(ar), cmap='viridis', extent=(xmin, xmax, ymin, ymax)) ax.set_title(layer_name + " " + str(np.array(ar).shape)) if len(SAVE_AR_LIST) == 0: break # plt.show() plt.savefig(os.path.join(FOLDER_TO_SAVE, str(PIC_NUM) + '.png'), fmt='png') plt.close(fig) PIC_NUM += 1 ### if PLOT_MODEL: from keras.utils.vis_utils import plot_model plot_model( model=model, to_file=os.path.join(FOLDER_TO_SAVE, model.name + " neural network architecture.png"), show_shapes=True, show_layer_names=True ) ### 

  • def build_model (IN_SHAPE = 50 ، CLASSES = 5) -> متسلسل:
     def build_model(IN_SHAPE=50,CLASSES=5) -> Sequential: inputs_LAYER0 = Input(shape=(IN_SHAPE,IN_SHAPE)) Dense_2_2 = Dense(75, activation='relu')(inputs_LAYER0) Dense_2_3 = Dense(50, activation='relu', name="my_dense")(Dense_2_2) Dense_2_4 = Dense(25, activation='relu')(Dense_2_3) Dense_2_5 = Dense(10, activation='relu')(Dense_2_4) flat_f_0 = Flatten()(Dense_2_5) final_layer= Dense(CLASSES, activation='softmax')(flat_f_0) # model = Model(input=inputs_LAYER0, output=final_layer, name="simple model") model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy']) model.summary() return model 


رمز البرنامج

 model_ = build_model() pattern = np.random.sample((1,50,50)) os.makedirs("PLOT_PATTERN_PROCCESS") PLOT_PATTERN_PROCCESS( model = model_, pattern = pattern, FOLDER_TO_SAVE = "PLOT_PATTERN_PROCCESS", PLOT_MODEL=False, grid_size=(2, 2) ) 

وصف البرنامج


الطريقة

 build_model() 

تقوم بإرجاع نموذج ANN بالتنسيق التسلسلي ، المصمم لتصنيف شيء ما إلى 5 فئات.

نموذج.ملخص ()
 _________________________________________________________________ Layer (type) Output Shape Param # ================================================================= input_1 (InputLayer) (None, 50, 50) 0 _________________________________________________________________ dense_1 (Dense) (None, 50, 75) 3825 _________________________________________________________________ my_dense (Dense) (None, 50, 50) 3800 _________________________________________________________________ dense_2 (Dense) (None, 50, 25) 1275 _________________________________________________________________ dense_3 (Dense) (None, 50, 10) 260 _________________________________________________________________ flatten_1 (Flatten) (None, 500) 0 _________________________________________________________________ dense_4 (Dense) (None, 5) 2505 ================================================================= Total params: 11,665 Trainable params: 11,665 Non-trainable params: 0 _________________________________________________________________ 


كما ترون من الهيكل ، فإن النمط عبارة عن صفيف بحجم 50 × 50. متغير

 pattern 

وهناك كائن يمكن ملاحظته.
بعد ذلك ، يتم إنشاء دليل

 os.makedirs("PLOT_PATTERN_PROCCESS") 
،
حيث سيتم حفظ النتيجة بأكملها.

طريقة الوصف PLOT_PATTERN_PROCCESS


لقد وصفت معنى الطريقة المذكورة أعلاه ، ولكن من المهم أن نقول إننا لسنا بحاجة إلى جميع الطبقات ، لأن مخرجات بعض الطبقات لا يمكن عرضها أو أن ذلك لن يكون مفيدًا.
الحصول على نمط الإخراج يحدث هنا:

 _output = _model.predict(pattern)[0] 

في هذا التطبيق ، يمكنك عرض نمط إخراج ثنائي الأبعاد لا تقل أبعاده عن المعلمة

 limit_size_layer 

بالتناوب خلال طبقات نموذج ANN ، المتغير

 SAVE_AR_LIST 
مليئة تدريجيا مع البيانات:

  1. رقم الطبقة

     num_layer 
  2. اسم الطبقة

     model.layers[num_layer].name 
  3. إخراج مجموعة ثنائية الأبعاد

      _output.tolist() 

باستثناء تدريجيا نتيجة واحدة من

 SAVE_AR_LIST 
،
ووضعها في خلية قماش

 ax.imshow(np.array(ar), cmap='viridis', extent=(xmin, xmax, ymin, ymax)) 
.
والنتيجة هي ملف (0.png)

الصورة

توصيات


  • اضبط اسم الطبقة على النحو التالي:

     Dense_2_3 = Dense(50, activation='relu', name="my_dense")(Dense_2_2) 

    هذا مريح للغاية عند تقييم ومقارنة مع العمارة العصبية.
  • باستخدام هذا النهج ، من الممتع مشاهدة كيف يتغير النمط عند اجتياز الشبكة عند التعلم من عصر إلى عصر
  • لا تقم بتثبيت الشبكة

     grid_size 

    كبير ل حجم الصور المعروضة سيكون صغيراً وغير إعلامي
  • إذا لاحظت مرور الديناميات (أثناء التدريب أو تمرير حزمة من الأنماط) ، فإننا نتحدث بالفعل عن معلومات ذات أحجام كبيرة. لتقليل ذاكرة الوصول العشوائي التي يشغلها التطبيق ، من الأفضل حفظ المصفوفات في الملفات على جهاز كمبيوتر ، على سبيل المثال ، بتنسيق JSON ، وبعد معالجة جميع الأنماط ، تكرر عبر الملفات واحدة تلو الأخرى وتحويلها إلى صور

حظا سعيدا

Source: https://habr.com/ru/post/ar438972/


All Articles