Filter by دسته‌ها
chatGTP
ابزارهای هوش مصنوعی
اخبار
گزارش
تیتر یک
چندرسانه ای
آموزش علوم داده
اینفوگرافیک
پادکست
ویدیو
دانش روز
آموزش‌های پایه‌ای هوش مصنوعی
اصول هوش مصنوعی
یادگیری بدون نظارت
یادگیری تقویتی
یادگیری عمیق
یادگیری نیمه نظارتی
آموزش‌های پیشرفته هوش مصنوعی
بینایی ماشین
پردازش زبان طبیعی
پردازش گفتار
چالش‌های عملیاتی
داده کاوی و بیگ دیتا
رایانش ابری و HPC
سیستم‌‌های امبدد
علوم شناختی
دیتاست
رویدادها
جیتکس
کاربردهای هوش مصنوعی
کتابخانه
اشخاص
شرکت‌های هوش مصنوعی
محصولات و مدل‌های هوش مصنوعی
مفاهیم
کسب‌و‌کار
تحلیل بازارهای هوش مصنوعی
کارآفرینی
هوش مصنوعی در ایران
هوش مصنوعی در جهان
مقاله
 کاربرد توابع Callback در کتابخانه تنسورفلو

کاربرد توابع Callback در کتابخانه تنسورفلو

زمان مطالعه: 4 دقیقه

می‌دانید چطور باید یک مدل یادگیری عمیق ساخته و آن‌را ارتقا دهید؟ یا می‌دانید چطور باید توابع 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 سفارشی خود را در کتابخانه تنسورفلو بسازید.

با کمک آموخته‌های این مقاله با یکی از ویژگی‌های مهم کتابخانه تنسورفلو آشنا شدید که به شما کمک می‌کند علاوه بر ساخت محصولاتی شگفت‌انگیز، از اتفاقاتی که هنگام آموزش درون مدل‌تان رخ می‌دهد آگاه باشید.

میانگین امتیاز / 5. تعداد ارا :

مطالب پیشنهادی مرتبط

اشتراک در
اطلاع از
0 نظرات
بازخورد (Feedback) های اینلاین
مشاهده همه دیدگاه ها
[wpforms id="48325"]