کاربرد توابع Callback در کتابخانه تنسورفلو
میدانید چطور باید یک مدل یادگیری عمیق ساخته و آنرا ارتقا دهید؟ یا میدانید چطور باید توابع Callback سفارشی ایجاد کنید؟ توابع Callback مجموعه توابعی هستند که در مراحل خاصی از فرآیند آموزش مدل اجرا میشوند. از توابع Callback میتوان برای شناخت حالات و آمار درونی مدل طی آموزش استفاده کرد.
به بیان دیگر، توابع Callback همچون صفحه کیلومترشمار خودرو میمانند. با استفاده از صفحه کیلومترشمار میتوانید از میزان سوخت، سرعت، فشار لاسیتکها و موارد دیگر مطلع شوید، به صورت ایمن و با کنترل کامل رانندگی کنید و دچار حادثه نشوید. توابع Callback شبیه به نسخهای از این صفحات هستند که قابلیتهای خودرانی را هم به اطلاعات قبلی اضافه میکنند؛ این توابع کاربردهای زیادی دارند؛ برای مثال، با استفاده از آنها میتوانید بر تابع زیان نظارت داشته باشید و در صورتی که مدل به مشکلی برخورد به سرعت آن را متوقف کنید.
انواع توابع Callback
در تنسورفلو 2.0 توابع Callback زیادی وجود دارند. در این قسمت در مورد هرکدام از این توابع، وظایف و پیادهسازی آنها صحبت خواهیم کرد.
BaseLogger
تابع BaseLogger به صورت پیشفرض روی مدل شما اجرا خواهد شد و نیازی به فراخوانی مستقیم ندارد. زمانی که دستور ()history = model.fit . را مینویسید، متغیر history به یک شیء tf.keras.callbacks.History منتسب میشود. مقدار محاسبهشده history برای این شیء یک دیکشنری است که اطلاعات مربوط به میانگین دقت و میانگین تابع زیان هر دوره آموزشی را دربردارد. مقدار محاسبهشده params نیز یک دیکشنری شامل پارامترهایی است که برای برازش مدل استفاده میشوند.
tf.keras.callbacks.BaseLogger()
CSVLogger
تابع CSVLogger یک فایل CSV روی دیسک مینویسد؛ این فایل اطلاعاتی را در مورد دورهای آموزشی، صحت و تابع زیان در برمیگیرد که بعداً میتوان مورد بررسی قرار داد. در صورتی که میخواهید نمودارهای خود را رسم یا روند آموزش مدلتان را در طی زمان ثبت کنید، این تابع میتواند بسیار مفید باشد. برای فراخوانی و استفاده از تابع CVSLogger این کد را در فایل آموزشی خود اجرا کنید:
import tensorflow as tf from tf.keras.callbacks import CSVLogger csv_logger = CSVLogger('training.log') model.fit(X_train, Y_train, callbacks=[csv_logger])
EarlyStopping
زمانی که معیارهای تحت نظارت (همچون تابع زیان یا صحت) بعد از چندین دور بهبود نیابند، تابع EarlyStopping فرآیند آموزش را متوقف میکند. با استفاده از این تابع میتوان آموزش غیرضروری مدل را (وقتی که بهبودی اتفاق نمیافتد) کاهش داد.
import tensorflow as tf from tf.keras.callbacks import EarlyStopping callback = EarlyStopping(monitor='loss', patience=3) # This callback will stop the training when there is no improvement in # the validation loss for three consecutive epochs. model = tf.keras.models.Sequential([tf.keras.layers.Dense(10)]) model.compile(tf.keras.optimizers.SGD(), loss='mse') history = model.fit(np.arange(100).reshape(5, 20), np.zeros(5), epochs=10, batch_size=1, callbacks=[callback], verbose=0) len(history.history['loss']) # Only 4 epochs are run.
ModelCheckpoint
تابع ModelCheckpoint بعد از یک یا چند دور آموزشی موفقیتآمیز (این تعداد را خودتان، برای مثال، بر اساس میزان دقت یا تابع زیان تعیین میکنید) مدل را به صورت یک فایل checkpoint، در فرمت hdf5، روی دیسک ذخیره میکند. نام فایلهای خروجی میتواند به صورت پویا براساس شماره دور مشخص شود و همچنین میتوان در کنار آن معیار موردنظر خود را به عنوان بخشی از نام فایل وارد کنید. این تابع Callback در شرایطی که اجرای یک دور آموزشی زمان زیادی میبرد (در شبکههای عمیق) و نمیخواهید در صورت اختلال در سیستم، اطلاعات آموزشی مهم را از دست بدهید، بسیار مفید خواهد بود. یکی دیگر از کاربردهای این تابع هنگام استفاده از فضای AWS AWS spot instances برای آموزش مدل است که نمیخواهید منابع مورد استفاده از مقدار ماکزیمم فراتر بروید.
LearningRateScheduler
یکی از مهمترین مواردی که در فرآیند بهینهسازی آموزش مدل با آن روبرو خواهید شد، تنظیم یک مقدار بهینه برای نرخ یادگیری است؛ این نرخ یادگیری بهینه در نهایت اندازه گامها در طی فرآیند گرادیان کاهشی را تعیین میکند. مسئله اینجاست که تنظیم یک مقدار ثابت برای نرخ یادگیری باعث میشود تابع هزینه/هدف Cost/objective function شبکه شما همگرایی ایدهآلی نداشته باشد؛ به همین دلیل بهترین کار استفاده از نرخ یادگیری متغیر است.
بدین منظور میتوانید با یک مقدار نسبتاً بزرگ شروع کرده و طی دورهای آموزشی آن را کاهش دهید. برای تنظیم نرخ یادگیری، باید یک تابع ساده بنویسید که خروجی آن نرخ یادگیری دلخواه بر اساس دور آموزش جاری است و این خروجی را به عنوان پارامتر schedule وارد تابع LearningRateScheduler کنید.
RemoteMonitor
RemoteMonitor یک تابع Callback مفید است که هنگام آموزش استفاده میشود. این تابع برای ارسال وقایع events به سرور مورد استفاده قرار میگیرد. وقایع شامل اطلاعاتی همچون گزارش آموزش، رویههای طولانی Verbose procedures و سایر اطلاعات میشوند. این تابع به کتابخانه requests نیاز دارد. وقایع به صورت پیشفرض به root + ‘/publish/epoch/end/’ فرستاده میشوند. این تابع یک روش POST HTTP است به همراه آرگومانی که دیکشنری از دادههای وقایع به فرمت JSON میباشد. اگر send_as_json روی True تنظیم شده باشد، محتوای درخواست از نوع application/JSON خواهد بود. در غیر این صورت، JSON موازیسازی شده Serialized JSON درون یک فرم فرستاده خواهد شد.
TensorBoard
احتمالا با کتابخانه های یادگیری عمیق آشنایی دارید. اما اگر تا به حال با کتابخانه تنسورفلو کار کرده باشید احتمالاً با کاربردهای جالب تابع TensorBoard آشنایی دارید. این ابزار با مصورسازی آنچه طی آموزش رخ میدهد به توسعهدهندگان کمکهای زیادی ارائه داده است. یکی از راههای فعالسازی این ویژگیها برای مدلی که در دست دارید، به کاربردن تابع TensorBoard است. با استفاده از این تابع، وقایع داخل یک مسیر نوشته میشوند که بعداً میتوانید آن را با کمک ابزار TensorBoard مورد بررسی قرار دهید.
import tensorflow as tf from tf.keras.callbacks import Tensorboard tensorboard_callback = TensorBoard(log_dir="./logs") model.fit(x_train, y_train, epochs=2, callbacks=[tensorboard_callback])
با این دستور میتوانید TensorBoard را روی سیستم خود آغاز کنید:
# run the tensorboard command to view the visualizations. tensorboard --logdir=path_to_your_logs
ReduceLROnPlateau
وقتی معیار خاصی که طی آموزش تعیین کردهاید (مثل صحت یا خطا) دیگر بهبود پیدا نکند، تابع ResuceLROnPlateau نرخ یادگیری را کاهش میدهد. بعد از ایستا بودن یادگیری مدل، کاهش نرخ یادگیری با ضریبی بین 2-10 به سود مدل خواهد بود. به بیان دیگر، این تابع بر یک مقدار کمی نظارت دارد و زمانی که بعد از طی چند دور آموزشی هیچ بهبودی رخ ندهد، نرخ یادگیری را کاهش میدهد.
import tensorflow as tf from tf.keras.callbacks import ReduceLROnPlateau reduce_lr = ReduceLROnPlateau(monitor='val_loss', factor=0.2, patience=5, min_lr=0.001) model.fit(X_train, Y_train, callbacks=[reduce_lr])
LambdaCallback
در صورتی که هیچ یک از توابع بالا نیازهای شما را برآورده نکردند، با استفاده از تابع LambdaCallback میتوانید تابع Callback سفارشی خود را بسازید.
import tensorflow as tf from tf.keras.callbacks import LambdaCallback
با کدهایی که در این قسمت نوشته شده میتوانید به چندین مورد از کاربردهای LambdaCallback پی ببرید.
# Print the batch number at the beginning of every batch. batch_print_callback = LambdaCallback( on_batch_begin=lambda batch,logs: print(batch))
با استفاده از این کد نیز میتوانید تابع خطا دور آموزشی را وارد فایلی با فرمت JSON کنید. محتوای فایل دقیقاً شکل فرمت JSON را نخواهد داشت، اما در هرخط خروجی شبیه JSON به دست میدهد.
import json json_log = open('loss_log.json', mode='wt', buffering=1) json_logging_callback = 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() )
سپس بعد از اتمام آموزش مدل، بدین شکل چندین فرآیند را خاتمه دهید.
processes = ... #complete this before running the script cleanup_callback = LambdaCallback( on_train_end=lambda logs: [ p.terminate() for p in processes if p.is_alive()]) model.fit(..., callbacks=[batch_print_callback, json_logging_callback, cleanup_callback])
علاوه بر این موارد میتوانید از توابع Callback سفارشی Keras نیز استفاده کنید. تابع Callback سفارشی ابزاری قدرتمند است که با استفاده از آن میتوان رفتار مدل Keras را طی آموزش، ارزیابی یا استنتاج تعیین کرد، این تعیین رفتار شامل خواندن/تغییر مدل نیز میشود.
حال قصد داریم یک تابع Callback سفارشی vanilla بسازیم. با انتقال تنسورفلو و تعریف یک مدل ساده متوالی Keras کار را شروع میکنیم:
سپس دادههای MNIST را برای آموزش و آزمایش از رابطهای کاربری Keras دریافت میکنیم:
حال، یک تابع Callback سفارشی ساده را برای پیگیری شروع و انتهای هر بستهداده تعریف میکنیم. این تابع هربار، شماره دورهها را چاپ میکند.
استفاده از توابع Callback برای مدلسازی روشهایی همچون ()tf.keras.Model.fit باعث میشود بدانیم که حتماً در آن مراحل فراخوانی (اجرا) میشوند:
بدین ترتیب میتوانید تابع Callback سفارشی خود را در کتابخانه تنسورفلو بسازید.
با کمک آموختههای این مقاله با یکی از ویژگیهای مهم کتابخانه تنسورفلو آشنا شدید که به شما کمک میکند علاوه بر ساخت محصولاتی شگفتانگیز، از اتفاقاتی که هنگام آموزش درون مدلتان رخ میدهد آگاه باشید.