اذهب إلى المحتوى
  • 0

تعريَف callback من خلال الأداة LambdaCallback في كيراس Keras وتنسرفلو Tensorflow

عامر ابراهيم

السؤال

Recommended Posts

  • 1

يمكنك استخدام الكلاس LambdaCallback  التي تسمح لك بتعريفَ callback خاص بك وبالطريقة التي تريدها. باني هذا الكلاس يأخذ الوسطاء التالية التي تسمح لك بالتحكم في توقيت تنفيذ ال callback:

tf.keras.callbacks.LambdaCallback(
    on_epoch_begin=None,
    on_epoch_end=None,
    on_batch_begin=None,
    on_batch_end=None,
    on_train_begin=None,
    on_train_end=None,
    **kwargs
)

on_epoch_begin أي الاستدعاء يتم في بداية كل epoch. و on_epoch_end أي في نهايته. on_batch_begin أي في بداية الباتش... وهكذا بالنسبة لللبقية.
بالنسبة ل on_epoch_begin و on_epoch_end فهما يتوقعان منك أن تتستخدم معهما وسيطين موضعيين هما ال epoch, logs. بالنسبة ل on_batch_begin و on_batch_end يتوقعان وسيطين أيضاً هما batch, logs. وأخيراً on_train_begin و on_train_end يتوقعان فقط وسيط واحد وهو logs. الآن لجعل الأمور أوضح سنأخذ المثال التالي:

# بناء نموذج
# compile ترجمته من خلال الدالة 
# fit الآن عندما نريد تعريف الكولباك يجب أن يتم ذلك قبل تنفيذ الدالة 
# تعريف الكولباك الذي طلبته
mycallback= LambdaCallback(on_epoch_end=lambda epoch, logs:model.save_weights(myfile.hdf5) if logs["val_accuracy"]>0.7 else None)
#لكن لاتنسى أن تقوم بتمرير الكولباك الذي عرفناه للدالة أي fit الآن تقوم بتدريب النموذج من خلال الدالة 
model.fit(...,
          callbacks=[mycallback])

وبالتالي سيتم حفظ أوزان النموذج كلما كانت قيمة ال val_acc أكبر من 70 في المئة.
مثال آخر حيث سنقوم بتعريف كولباك يقوم بطباعة رقم الحزمة في بداية كل باتش:

callback1 = LambdaCallback(
    on_batch_begin=lambda batch,logs: print(batch))

تعريف كول باك آخر يقوم بحفظ ال loss في نهاية كل epoch في ملف JSON (الملف سيكون عبارة عن كائن json في كل سطر):

import json
json_log = open('loss_log.json', mode='wt', buffering=1) #json إنشاء ملف 
callback2 = LambdaCallback(
    on_epoch_end=lambda epoch, logs: json_log.write(
        json.dumps({'epoch': epoch, 'loss': logs['loss']}) + '\n'),
    on_train_end=lambda logs: json_log.close()
)

الآن نقوم بتمريرهم للدالة fit عندما نريد بدأ التدريب:

model.fit(...,
          callbacks=[callback1,
                     callback2])
رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 1

كما أوضح علي فان تعريف ال callback في tensorflow كالتالي:

tf.keras.callbacks.LambdaCallback(
    on_epoch_begin=None,
    on_epoch_end=None,
    on_batch_begin=None,
    on_batch_end=None,
    on_train_begin=None,
    on_train_end=None,
    **kwargs
)

سأكمل على شرح علي بتوضيح بعض الأمثلة عن كيفية استخدامها، انظر المثال التالي لتري كيف يمكن استخدامها في سطر واحد مع استخدام الشروط كذلك

from keras.callbacks import LambdaCallback
call = LambdaCallback(on_epoch_end= lambda epochs, logs: (model.stop_training:=True) if logs.get('acc')>0.99 else None)

المثال التالي يوضح استخدامها كاملا داخل دالة:

def get_callbacks(self, X):


        sample_output_callback = LambdaCallback(on_epoch_end = lambda epoch, logs:\
                                                logging.debug(pformat(self.sample_labels(self.model.predict(X)))))
        checkpoint = ModelCheckpoint(os.path.join(self.model_dir,
                                                  "weights.hdf5"),
                                     verbose = 1,
                                     save_best_only = False)  

        return [sample_output_callback,
                checkpoint] 

 

رابط هذا التعليق
شارك على الشبكات الإجتماعية

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...