عامر ابراهيم نشر 17 سبتمبر 2021 أرسل تقرير نشر 17 سبتمبر 2021 أريد تعريَف callback مخصص، كيف يمكن القيام بذلك مثلاً أريد أن يتم حفظ النموذج عندما تصبح الدقة أكبر من قيمة محددة؟ 1 اقتباس
1 Ali Haidar Ahmad نشر 17 سبتمبر 2021 أرسل تقرير نشر 17 سبتمبر 2021 يمكنك استخدام الكلاس 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 اقتباس
1 Ahmed Sharshar نشر 17 سبتمبر 2021 أرسل تقرير نشر 17 سبتمبر 2021 كما أوضح علي فان تعريف ال 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] اقتباس
السؤال
عامر ابراهيم
أريد تعريَف callback مخصص، كيف يمكن القيام بذلك مثلاً أريد أن يتم حفظ النموذج عندما تصبح الدقة أكبر من قيمة محددة؟
2 أجوبة على هذا السؤال
Recommended Posts
انضم إلى النقاش
يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.