خانه > مقالات آموزشی > وقتی داده های محدودی داریم، چگونه از یادگیری عمیق استفاده کنیم؟ بخش دوم : داده افزایی

وقتی داده های محدودی داریم، چگونه از یادگیری عمیق استفاده کنیم؟ بخش دوم : داده افزایی

این مقاله، مروری جامع بر روش های داده افزایی برای یادگیری عمیق، به ویژه برای تصاویر است. این مطالب، بخش دوم از مقاله “ زمانی که داده های محدود در دسترس باشند، چگونه از یادگیری عمیق استفاده می شود؟” است که بخش اول آن را می توانید اینجا ببینید.

داده افزایی بزرگ کردن پایگاه داده

همه ی ما به این مشکل بر خورده ایم. شما ایده ای دارید که با استفاده از یک مدل یادگیری ماشین قابل پیاده سازی است. با هیجان، مرورگر خود را باز کرده و داده های مربوطه را جستجو می نمایید. به احتمال زیاد، پایگاه داده ای را می یابید که حدود چند صد تصویر دارد.

 به خاطر دارید که بیشتر پایگاه داده های متداول و عمومی، دارای ده ها هزار ( یا بیشتر ) تصویر هستند. همچنین به یاد می آورید که داشتن یک پایگاه داده بزرگ، برای حصول یک عملکرد خوب مهم است. ممکن است مأیوسانه از خود بپرسید که ” آیا شبکه عصبی جدید من با داده ها ی کمی  که در اختیار دارم، خوب عمل می کند یا خیر “؟

پاسخ مثبت است. قبل از دست به کار شدن، باید به برخی از پرسش های اساسی پاسخ داده شوند.

چرا باید مقدار داده زیاد وجود داشته باشد؟

جزئیات مدل های یادگیری عمیق
تعداد پارامترها ( در واحد میلیون ) برای شبکه ها ی عصبی متداول

زمانی که شما یک مدل یادگیری ماشین را آموزش می دهید، در حقیقت، پارامتر های آن را بگونه ای تنظیم می کنید که بتواند یک ورودی خاص (مانند تصویر) را به خروجی (یک برچسب) نگاشت دهد. هدف از بهینه سازی ما، تعقیب آن نقطه مطلوبی است که تلفات مدل ما در آنجا کم باشد و این موضوع زمانی رخ می دهد که پارامتر های مدل به درستی تنظیم شده باشند.

شبکه ها ی عصبی جدید و مدرن معمولاً دارای چندین میلیون پارامتر هستند.

طبیعتاً اگر شما پارامتر های بسیار زیادی داشته باشید، لازم است تعداد مناسبی از مثال ها را به مدل خود نشان دهید تا عملکرد خوبی را بدست آورید. همچنین، تعداد پارامترهایی که نیاز دارید، متناسب با پیچیدگی وظیفه ای است که مدل شما انجام می دهد.

اگر داده زیادی نداشته باشم، چگونه می توانم آن ها را بدست آورم؟

لازم نیست به دنبال داده های جدیدی باشید تا پایگاه داده خود اضافه کنید. چرا؟ زیرا شبکه ها ی عصبی در ابتدا هوشمند نیستند. برای مثال، یک شبکه عصبی با آموزش ضعیف، تصور می کند سه توپ تنیس نشان داده در زیر، مجزا و بصورت تصاویر منحصربفردی هستند.

تصویر جابجا شده داده افزایی
یک توپ تنیس با جابجایی ها ی مختلف

بنابراین، برای بدست آوردن داده های بیشتر، تنها لازم است تغییرات جزئی را در پایگاه داده فعلی خود انجام دهید. از جمله تغییرات جزئی، قرینه سازی ( Flip ) ، جابجایی و یا چرخش است. بهر حال، شبکه عصبی ما فکر می کند که این تصاویر مجزا هستند.

داده افزایی در شبکه عصبی
داده افزایی

یک شبکه عصبی کانولوشنی که می تواند اشیا را حتی اگر در جهات مختلف قرار گیرند، بصورت مقاوم کلاسه بندی کند، دارای ویژگی تغییرناپذیری ( Invariance ) خواهد بود. بطور خاص، یک CNN می تواند نسبت به جابجایی، نقطه دید ، اندازه و یا شدت روشنایی (یا ترکیبی از این ها) تغییرناپذیر باشد.

این موضوع، اساساً فرضیه داده افزایی است. در دنیای واقعی، ممکن است پایگاه داده ای داشته باشیم که تصاویر آن در شرایط محدودی تهیه شده باشد. اما برنامه هدف ما ممکن است در شرایط مختلفی مانند جهت، موقعیت، مقیاس، روشنایی و غیره وجود داشته باشد. این موقعیت ها ، توسط آموزش شبکه عصبی با داده ها ی اصلاح شده مصنوعی اضافی در نظر گرفته می شوند.

آیا اگر داده ها ی زیادی داشته باشیم نیز داده افزایی  کمک می کند؟

بله. این کار به افزایش تعداد داده های مرتبط در پایگاه داده شما کمک می کند که متناسب با روشی است که شبکه های عصبی در آن آموزش می بینند. اجازه دهید این موضوع را با مثالی نشان دهیم.

داده های نا کافی داده افزایی
دو کلاس در پایگاه داده فرضی ما. خودروی موجود در سمت چپ برند A (فورد) و خودروی سمت راست برند B (شورلت) را نشان می دهد.

تصور کنید که پایگاه داده ای شامل بر دو برند خودرو دارید که در شکل فوق نشان داده شده است. فرض می کنیم که تمام خودرو ها ی با برند A، دقیقاً مشابه تصویر سمت چپ قرار گرفته اند (یعنی، نمای تمام خودروها به سمت چپ است). به همین ترتیب، تمام خودروهای برند B نیز دقیقاً مشابه با تصویر سمت راست قرار گرفته اند (نمای خودرو به سمت راست است). اکنون، این پایگاه داده را به شبکه عصبی مدرن خود می دهید و انتظار دارید که پس از آموزش آن، به نتایج مطلوبی دست یابید.

تصویر آزمایش داده های نا کافی
یک ماشین فورد (برند A) اما به سمت راست

فرض کنید آموزش شبکه انجام شده و تصویر فوق که از برند A هست را به شبکه می دهید. اما شبکه عصبی در خروجی، برند B را معرفی می کند! شما گیج می شوید. آیا شما با استفاده از شبکه عصبی جدید، روی پایگاه داده خود دقت ۹۵ درصد را بدست نیاوردید؟ اغراق نمی کنیم، اما اشتباهات مشابهی همواره رخ داده است.

چرا این موضوع رخ می دهد؟ این حالت، نحوه عملکرد بسیاری از الگوریتم های یادگیری ماشین است. این شبکه ها بدیهی ترین ویژگی هایی که یک کلاس را از دیگری متمایز می کنند، می یابند. در اینجا، این ویژگی این است که نمای تمام خودروهای برند A به سمت چپ و خودروهای برند B به سمت راست هستند.

شبکه عصبی شما، به همان خوبی داده هایی است که به آن می دهید.

چگونه می توان از این رویداد جلوگیری نمود؟ ما باید مقدار ویژگی های نامربوط در پایگاه داده را کاهش دهیم. برای کلاسه بند مدل ماشین که در بالا بدان اشاره شد، یک راه حل ساده، اضافه نمودن تصاویری از ماشین های هر دو کلاس است که در جهتی مخالف با پایگاه داده ما می باشند. بهتر از این روش، آن است که تصاویر موجود در پایگاه داده را بصورت افقی بچرخانید، بگونه ای که در جهت مخالف قرار گیرند! اکنون با آموزش شبکه عصبی روی این پایگاه داده جدید، می توانید به عملکردی که دلخواه شماست، دست یابید.

با انجام این عملیات افزایش داده، می توان از یادگیری ویژگی ها ی نامرتبط، توسط شبکه عصبی خود جلوگیری نموده و اساساً عملکرد کلی را بهبود  بخشید.

شروع

قبل از آنکه به روش های مختلف افزایش داده بپردازیم، مسئله ای وجود دارد که باید قبل از آن بررسی گردد.

در خط لوله ( Pipeline ) یادگیری ماشین خود، کجا باید داده افزایی  را انجام داد؟

پاسخ ممکن است بدیهی به نظر برسد؛ این داده افزایی  قبل از ورود داده ها  به مدل انجام می شود. بله، درست است، اما در اینجا دو گزینه پیش روی شماست. گزینه نخست آن است که از قبل، تمام تبدیلات لازم را انجام دهید که با این کار، اساساً اندازه پایگاه داده خود را افزایش می دهید. گزینه دیگر آن است که این تبدیلات را روی یک دسته کوچکی از تصاویر انجام دهید و سپس آن را به مدل یادگیری ماشین خود بدهید.

گزینه نخست، تحت عنوان افزایش آفلاین ( Offline Augmentation ) خوانده می شود. این روش برای پایگاه های داده نسبتاً کوچک تر ترجیح داده می شود، چرا که شما در این روش می توانید افزایش اندازه پایگاه داده را با ضریبی برابر با تعداد تبدیلاتی که انجام داده اید، به پایان برسانید (برای مثال، با قرینه سازی تمام تصاویر، اندازه پایگاه داده با ضریب دو افزایش می یابد).

گزینه دوم، تحت عنوان افزایش آنلاین ( Online Augmentation ) یا افزایش در حین اجرا ( Augmentation On The Fly ) خوانده می شود. این روش برای پایگاه های داده بزرگتر ترجیح داده می شود، چرا که شما نمی توانید از عهده افزایش زیاد در اندازه پایگاه داده برآیید. بجای آن، شما تبدیلات را روی دسته های کوچکی از داده ها  که می خواهید به مدل خود بدهید، اجرا می کنید. برخی از چارچوب های یادگیری ماشین، افزایش آنلاین را پشتیبانی می کنند، که می تواند روی GPU تسریع شود.

روش ها ی مرسوم افزایش داده ها  

در این بخش، برخی از روش های پایه اما قدرتمند داده افزایی که معمولاً استفاده می شوند، ارائه می گردد. قبل از پرداختن به این روش ها، برای سادگی، فرضیه ای مطرح می شود و آن این است که لازم نیست آنچه در بیرون از مرز تصویر قرار می گیرد، در نظر گرفته شود. در ادامه روش هایی بیان می شوند که فرضیه ما در آن ها معتبر است.

اگر از روشی استفاده کنیم که مجبور شویم آنچه را که فراتر از مرز یک تصویر است حدس بزنیم، چه اتفاقی می افتد؟ در این حالت، نیاز به وارد نمودن اطلاعاتی دیگر است. پس از بیان انواع روش های افزایش داده، به این مسئله می پردازیم.

برای هر یک از این روش ها ، ضریبی که با آن، اندازه پایگاه داده شما افزایش می یابد نیز تعیین می گردد (که تحت عنوان ضریب داده افزایی ( Data Augmentation Factor ) نامیده می شود).

۱- قرینه سازی ( Flip )

می توان تصاویر را بصورت افقی و عمودی قرینه نمود. برخی از چارچوب ها ، تابعی برای قرینه سازی عمودی ندارند. اما می توان گفت قرینه عمودی، همان چرخش یک تصویر با زاویه ۱۸۰ درجه و سپس انجام یک قرینه افقی است. شکل زیر، تصاویر قرینه شده را نشان می دهد.

داده افزایی قرینه سازی
از سمت چپ: تصویر اولیه، تصویر قرینه شده بصورت افقی، تصویر قرینه شده بصورت عمودی.

با استفاده از هر یک از فرامین زیر می توانید عملیات قرینه سازی را روی بسته های تصاویر خود انجام دهید.  ضریب داده افزایی = ۲ تا ۴ برابر

# NumPy.'img' = A single image.
flip_1 = np.fliplr(img)
# TensorFlow. 'x' = A placeholder for an image.
shape = [height, width, channels]
x = tf.placeholder(dtype = tf.float32, shape = shape)
flip_2 = tf.image.flip_up_down(x)
flip_3 = tf.image.flip_left_right(x)
flip_4 = tf.image.random_flip_up_down(x)
flip_5 = tf.image.random_flip_left_right(x)

۲- چرخش (Rotation )

نکته ای که در مورد این عملیات باید بدان توجه نمود آن است که ابعاد تصویر ممکن است پس از چرخش، حفظ نگردند. اگر تصویر شما یک مربع است، اندازه آن با یک چرخش نود درجه ای تغییر نمی کند. اما اگر مستطیل باشد، یک چرخش ۱۸۰ درجه ای، اندازه تصویر را حفظ می نماید. چرخش تصویر با زوایای کوچکتر نیز، اندازه نهایی تصویر را تغییر می دهد. در بخش بعد، نحوه حل این مسئله بررسی می شود. شکل زیر، تصاویری با چرخش نود درجه را نشان می دهد.

داده افزایی چرخش
از چپ به راست: تصاویر (دوم تا چهارم) نسبت به تصویر قبل از خود چرخش نود درجه ای دارند (ساعتگرد).

با استفاده از هر یک از فرامین زیر ، می توانید عملیات چرخش را روی بسته های تصاویر خود انجام دهید. ضریب داده افزایی = ۲ تا ۴ برابر

# Placeholders: 'x' = A single image, 'y' = A batch of images
# 'k' denotes the number of 90 degree anticlockwise rotations
shape = [height, width, channels]
x = tf.placeholder(dtype = tf.float32, shape = shape)
rot_90 = tf.image.rot90(img, k=1)
rot_180 = tf.image.rot90(img, k=2)
# To rotate in any angle. In the example below, 'angles' is in radians
shape = [batch, height, width, 3]
y = tf.placeholder(dtype = tf.float32, shape = shape)
rot_tf_180 = tf.contrib.image.rotate(y, angles=3.1415)
# Scikit-Image. 'angle' = Degrees. 'img' = Input Image
# For details about 'mode', checkout the interpolation section below.
rot = skimage.transform.rotate(img, angle=45, mode='reflect')

۳- مقیاس ( Scale )

تصویر می تواند بصورت درونی ( Inward ) و یا بیرونی ( Outward ) ، مقیاس بندی شود. اگر بصورت بیرونی مقیاس شود، اندازه نهایی تصویر بزرگ تر از اندازه تصویر اولیه است. عمده چارچوب های تصویر، بخشی از تصویر جدید را با اندازه ای برابر با تصویر اولیه برش می دهند. در بخش بعدی، مقیاس بندی بصورت داخلی را بررسی می کنیم، چرا که اندازه تصویر را کاهش می دهد و ما را مجبور می کند در مورد آنچه فراتر از مرزهای تصویر است، فرضیاتی را در نظر بگیریم. در شکل زیر، تصاویر مقیاس بندی شده نشان داده شده اند.

داده افزایی مقیاس
از چپ به راست: تصویر اولیه، تصویر مقیاس شده ۱۰ درصدی بصورت بیرونی، تصویر مقیاس شده ۲۰ درصدی بصورت بیرونی

با استفاده از فرامین زیر می توانید عملیات مقیاس بندی را انجام دهید ( با استفاده از scikit-image ). ضریب داده افزایی = دلخواه

# Scikit Image. 'img' = Input Image, 'scale' = Scale factor
# For details about 'mode', checkout the interpolation section below.
scale_out = skimage.transform.rescale(img, scale=2.0, mode='constant')
scale_in = skimage.transform.rescale(img, scale=0.5, mode='constant')
# Don't forget to crop the images back to the original size (for 
# scale_out)

۴- برش ( Crop )

برخلاف مقیاس بندی، شما تنها از بخشی از تصویر اولیه بصورت تصادفی نمونه برداری می کنید. سپس اندازه این بخش را به اندازه تصویر اولیه تغییر می دهید. این روش معمولاً تحت عنوان برش تصادفی خوانده می شود. در ادامه نمونه هایی از این برش نشان داده شده است. اگر شما به دقت نگاه کنید، متوجه اختلاف میان این روش و روش مقیاس بندی می شوید.

داده افزایی برش
از چپ به راست: تصویر اولیه، یک بخش مربعی برش خورده از بالا-چپ، یک بخش مربعی برش خورده از پایین-راست. اندازه این بخش ها ی برش خورده، مطابق با اندازه تصویر اولیه تغییر یافته اند.

شما می توانید برش ها ی تصادفی را با استفاده از هر یک از فرامین زیر برای تنسورفلو انجام دهید. ضریب داده افزایی = دلخواه

# TensorFlow. 'x' = A placeholder for an image.
original_size = [height, width, channels]
x = tf.placeholder(dtype = tf.float32, shape = original_size)
# Use the following commands to perform random crops
crop_size = [new_height, new_width, channels]
seed = np.random.randint(1234)
x = tf.random_crop(x, size = crop_size, seed = seed)
output = tf.images.resize_images(x, size = original_size)

۵- جابجایی ( Translation )

این عملیات، شامل حرکت تصویر در امتداد راستای X، Y  و یا هر دو راستا است. در مثال زیر، فرض می کنیم که تصویر دارای یک پس زمینه سیاه در بیرون از مرز خود می باشد، و بصورت مناسب جابجا شده است. این روش برای داده افزایی بسیار مفید است، چرا که اکثر اشیای موجود در تصاویر می توانند تقریباً در هرجایی از تصویر قرار گیرند. این موضوع، شبکه عصبی کانولوشنی شما را مجبور می کند که به همه جا نگاه کند.

داده افزایی جابجایی
از چپ به راست: تصویر اولیه، تصویر جابجا شده به سمت راست، تصویر جابجا شده به سمت بالا.

با استفاده از فرامین زیر می توانید عملیات جابجایی در تنسورفلو را انجام دهید. ضریب داده افزایی = دلخواه

# pad_left, pad_right, pad_top, pad_bottom denote the pixel 
# displacement. Set one of them to the desired value and rest to 0
shape = [batch, height, width, channels]
x = tf.placeholder(dtype = tf.float32, shape = shape)
# We use two functions to get our desired augmentation
x = tf.image.pad_to_bounding_box(x, pad_top, pad_left, height + pad_bottom + pad_top, width + pad_right + pad_left)
output = tf.image.crop_to_bounding_box(x, pad_bottom, pad_right, height, width)

نویز گوسی ( Gaussian Noise )

بیش برازش زمانی رخ می دهد که شبکه عصبی شما سعی به یادگیری ویژگی های فرکانس بالایی ( الگوهایی که به دفعات زیاد رخ می دهند ) دارد که ممکن است مفید نیز نباشند. نویز گوسی ، که دارای میانگین صفر است، دارای اطلاعاتی در تمام فرکانس ها می باشد و بدین ترتیب بصورت مؤثر، ویژگی ها ی فرکانس بالا را دچار اعوجاج می کند. همچنان مؤلفه ها ی فرکانسی پایین تر ( معمولاً داده های مورد نظر شما ) نیز ممکن است دچار اعوجاج شوند، اما شبکه عصبی شما یاد می گیرد که آن را نادیده بگیرد. اضافه نمودن تنها مقدار کمی نویز، می تواند قابلیت یادگیری را افزایش دهد.

حالتی ضعیف از این نویز ، نویز نمک و فلفل ( Salt and Pepper ) است که بصورت پیکسل های سفید و سیاه بصورت پراکنده در کل تصویر نمایش داده می شود. این نویز تأثیری مشابه با اضافه نمودن نویز گوسی دارد، اما سطح اعوجاج اطلاعاتی کمتری دارد.

داده افزایی نویز
از چپ به راست: تصویر اولیه، تصویر با نویز گوسین، تصویر با نویز نمک و فلفل

می توانید نویز گوسی را با استفاده از فرمان زیر در تنسورفلو به تصویر خود اضافه نمایید. ضریب داده افزایی = دلخواه

#TensorFlow. 'x' = A placeholder for an image.
shape = [height, width, channels]
x = tf.placeholder(dtype = tf.float32, shape = shape)
# Adding Gaussian noise
noise = tf.random_normal(shape=tf.shape(x), mean=0.0, stddev=1.0,
dtype=tf.float32)
output = tf.add(x, noise)

روش ها ی پیشرفته داده افزایی 

در جهان واقعی، داده ها ی طبیعی نیز می توانند در شرایط مختلفی وجود داشته باشند که با روش های ساده فوق نمی توانند در نظر گرفته شوند. برای مثال، فرض کنید هدف ما، شناسایی منظره در عکس باشد. این منظره می تواند هر چیزی باشد: توندراهای یخی ، مراتع ، جنگل و غیره. به نظر می رسد که این کار مانند کلاسه بندی پیش رو ( Forward Classification ) باشد. بله، بجز یک مورد، حق یا شماست. ما بر یک ویژگی مهم از عکس ها که می توانند در عملکرد تأثیر بگذراند، اشراف داریم و آن ویژگی، فصلی است که تصاویر در آن تهیه شده است. 

اگر شبکه عصبی ما این حقیقت را که مناظر معین می توانند در هر شرایطی وجود داشته باشند ( برف، رطوبت، روشنایی و غیره ) درک ننماید، ممکن است سواحل دریاچه یخ زده را بعنوان یخچال های طبیعی و یا زمین های مرطوب را به عنوان باتلاق ها  برچسب گذاری کند.

یک روش برای کاهش رخداد این وضعیت، اضافه نمودن تصاویر بیشتر است، بگونه ای که تمام تغییرات فصلی در نظر گرفته شوند. اما این کاری دشوار است. با بسط مفهوم داده افزایی ، می توان تولید جلوه ها یی مانند فصل های مختلف بصورت مصنوعی را تصور نمود.

 GAN های شرطی را دریابید!

بدون ورود به جزئیات،  GAN های شرطی می توانند یک تصویر را از یک حوزه به یک تصویر در حوزه دیگر تبدیل کنند. ممکن است تصور کنید که این موضوع مبهم است، اما اینگونه نیست و ایجا قدرت این شبکه عصبی مشخص می شود. در شکل زیر، مثالی از یک GAN شرطی نمایش داده شده است که برای تبدیل تصاویر، از مناظر تابستانی به مناظر زمستانی استفاده می شوند.

تغییر فصل با CycleGAN
تغییر فصل با استفاده از CycleGAN (منبع: https://junyanz.github.io/CycleGAN/)

روش فوق مقاوم است، اما محاسبات زیادی باید انجام شود. یک روش ارزانتر دیگر، روشی تحت عنوان انتقال سبک عصبی (Neural Style Transfer ) است. در این روش، بافت/محیط/ظاهر یک تصویر ( تحت عنوان سبک ) اتخاذ می شود و با محتوای تصویر دیگر ترکیب می گردد. با استفاده از این روش قدرتمند، تأثیری شبیه به GAN شرطی ایجاد می شود ( در حقیقت، این روش قبل از اختراع GAN شرطی معرفی شده بود! ).

اگر دوست دارید در مورد شبکه های GAN بیشتر بدانید، پیشنهاد می کنیم این مطلب را مطالعه کنید.

تنها نکته منفی این روش آن است که خروجی ها بجای واقع گرا بودن، هنری تر می باشند. به هرحال، پیشرفت های مشخصی مانند Deep Photo Style Transfer که در زیر نشان داده شده است وجود دارند که نتایج چشمگیری را بدست می دهند.

انتقال سبک عصبی
Deep Photo Style Transfer. توجه کنید که چگونه می توان تأثیر مطلوب و دلخواه خود را روی پایگاه داده مورد نظر ایجاد نمود (منبع: https://arxiv.org/abs/1703.07511)

ما این روش ها  را به صورت عمیق بررسی نکرده ایم، چرا که کار کرد دقیق آن ها مد نظر ما نمی باشد. ما می توانیم مدل های آموزش دیده موجود را به همراه یادگیری انتقالی ، جهت استفاده در داده افزایی  بکار گیریم.

نکته ای مختصر در مورد درونیابی

اگر بخواهیم تصویری را که دارای پس زمینه سیاه نباشد جابجا کنیم، یا یک تصویر را بصورت درونی مقیاس بندی کنیم و یا در زوایایی کوچک بچرخانیم، چه اتفاقی می افتد؟ پس از انجام این تبدیلات، لازم است که اندازه تصویر اولیه حفظ گردد. از آنجایی که تصویر ما در مورد آنچه خارج از مرز آن است، هیچ اطلاعاتی ندارد، لازم است فرضیاتی مطرح شوند. معمولاً فرض می شود فضای بیرونی مرز تصویر در هر نقطه، ثابت صفر است. بنابراین، زمانی که این تبدیلات انجام می شود، به ناحیه سیاهی می رسید که تصویر تعریف نشده است.

داده افزایی فضای بیرونی
از چپ به راست: تصویر چرخش یافته با زاویه ۴۵ درجه بصورت پادساعتگرد، یک تصویر جابجا شده به راست، یک تصویر مقیاس شده به داخل.

آیا این فرضیه صحیحی است؟ در جهان واقعی، این فرضیه همواره صحیح نیست. چارچوب ها ی پردازش تصویر و یادگیری ماشین دارای چندین روش استاندارد هستند که با آن ها می توان در مورد نحوه پر کردن این فضای نامشخص تصمیم گیری نمود، که در ادامه تعریف شده اند.

انواع روش ها برای فضای بیرونی
از چپ به راست: حالت ها ی ثابت، لبه، انعکاس، تقارن و حاشیه گذاری

۱- ثابت (Constant )

ساده ترین روش درونیابی، پر کردن نواحی نامشخص، با برخی از مقادیر ثابت است. این روش ممکن است برای تصاویر طبیعی کار نکند، اما می تواند برای تصاویر تهیه شده در یک پس زمینه تک رنگ، بکار گرفته شود.

۲- لبه ( Edge )

مقادیر لبه تصویر پس از مرز بسط می یابند. این روش برای جابجایی های متوسط مفید است.

۳- انعکاس ( Reflect )

مقادیر پیکسل تصویر در امتداد مرز منعکس می شوند. این روش برای پس زمینه ها ی پیوسته و یا طبیعی شامل درختان، کوه ها و غیره مفید است.

۴- تقارن (Symmetric )

این روش مشابه روش انعکاس است، بجز این حقیقت که در مرز انعکاس، یک نسخه از پیکسل های لبه ایجاد می شود. معمولاً روش های تقارن و انعکاس بجای یکدیگر استفاده می شوند، اما تفاوت های این دو روش زمانی قابل مشاهده خواهند بود که با تصاویر و یا الگوهای بسیار کوچک سرو کار داشته باشیم.

۵- بسته بندی ( Wrap )

در این روش، تصویر در خارج از مرز خود تکرار می شود، گویا کاشی کاری شده است. این روش به اندازه روش ها ی دیگر استفاده نمی شود، چرا که برای بسیاری از سناریو ها، معنایی ندارد.

اگر از تمام روش های فوق استفاده گردد، آیا الگوریتم یادگیری ماشین من مقاوم خوهد بود؟

اگر شما از این روش ها  به طرز صحیحی استفاده کنید، پاسخ مثبت است! روش درست مورد نظر شما چیست؟ خوب، برخی اوقات، همه روش های داده افزایی برای یک پایگاه داده معنایی ندارند. مجدداً مثال مربوط به خودرو را در نظر بگیرید. در شکل زیر، چندین روش بیان شده است که شما می توانید یک تصویر را تغییر دهید.

داده افزایی چرخش خودرو
از چپ به راست: تصویر اولیه، تصویر قرینه شده بصورت افقی، تصویر چرخانده شده با زاویه ۱۸۰ درجه و تصویر چرخانده شده با زاویه ۹۰ درجه (بصورت ساعتگرد).

مطمئناً این ها تصاویری از یک ماشین هستند، اما برنامه کاربردی هدف شما ممکن است تصاویر خودرو های ارائه شده در این جهات را هرگز نبیند.

برای نمونه، چنانچه بخواهید خودرو ها در جاده را کلاس بندی کنید، تنها تصویر دوم منطقی خواهد بود. اما چنانچه صاحب یک شرکت بیمه هستید که با خودرو های تصادفی سرو کار دارد، و بخواهید مدل هایی از خودرو های واژگون و شکسته را شناسایی کنید، تصویر سوم مناسب می باشد. تصویر پایانی، ممکن است برای دو سناریوی فوق، مناسب نباشد.

نکته این است، با وجود استفاده از روش های داده افزایی ، باید اطمینان حاصل شود که داده ها ی نامرتبط افزایش نمی یابند.

آیا واقعاً ارزش تلاش کردن دارد؟

احتمالاً شما انتظار دارید برخی از نتایج به شما انگیزه دهند که از جان خود مایه بگذارید. قابل قبول است. اجازه دهید که کارکرد واقعی داده افزایی  را با یک مثال کوچک اثبات کنم. شما نیز می توانید این آزمایش را جهت تأیید تکرار نمایید.

بیایید دو شبکه عصبی را برای کلاس بندی داده ها به یکی از چهار کلاس گربه، شیر، ببر و یا پلنگ ایجاد کنیم. ممکن است فردی از داده افزایی  استفاده کند و فرد دیگر استفاده ننماید. می توانید پایگاه داده را از لینک اینجا دانلود کنید.

چنانچه پایگاه داده را بررسی کنید، متوجه می شوید که برای هر دو روند آموزش و تست، تنها ۵۰ تصویر در هر کلاس وجود دارد. واضح است که نمی توانیم داده افزایی را برای یکی از کلاسه بند ها استفاده نماییم. برای اینکه این فرصت منطقی تر باشد، از یادگیری انتقالی استفاده می شود تا مدل های موجود با وجود داده های کم، شانس بهتری داشته باشند.

پایگاه داده گربه شیر ببر پلنگ
چهار کلاس استفاده شده در پایگاه داده ما

برای حالت بدون داده افزایی ، شبکهVGG19 در نظر گرفته می شود. در اینجا یک اجرای تنسورفلو بر اساس این پیاده سازی نوشته شده است. پس از کپی کردن repo من ، پایگاه داده را از اینجا و vgg19.npy (استفاده شده برای یادگیری انتقالی) را اینجا مشاهده کنید. اکنون شما می توانید مدل را برای تأثیر عملکرد آن، اجرا نمایید.

من با این موضوع موافقم که نوشتن کد اضافی برای داده افزایی ، باید با تلاش همراه باشد. بنابراین، برای ساختن مدل دوم خود، نانوشبکه ها را در نظر گرفتم. آن ها بصورت داخلی، از یادگیری انتقالی و داده افزایی جهت دستیابی به بهترین نتایج، با استفاده از حداقل داده ها استفاده می کنند. همه آنچه برای انجام این کار نیاز دارید، این است که داده ها را در وبسایت آنه ا بارگذاری کنید و تا زمانی که روی سرور های آن ها آموزش داده می شود، منتظر بمانید (معمولاً حدود ۳۰ دقیقه). آنچه شما می دانید برای آزمون مقایسه ما کامل است.

پس از انجام عملیات آموزش، می توانید API آن ها را فراخوانی کنید تا دقت تست محاسبه گردد. در اینجا، repo من را برای یک کد نمونه بررسی کنید (فراموش نکنید که شناسه مدل خود را در کد مربوطه قرار دهید).

Results
VGG19 (No Augmentation)- 76% Test Accuracy (Highest)
Nanonets (With Augmentation) - 94.5% Test Accuracy

این یک حقیقت است که بیشتر مدل ها  با داده های بیشتر، بهتر کار می کنند. بنابراین، برای ارائه اثبات مشخص، جدول زیر را در نظر گرفته ام. این جدول، نرخ خطای شبکه های عصبی مرسوم روی پایگاه های داده Cifar10 (C10) و Cifar100 (C100) را نشان می دهد. ستون ها ی C10+ و C100+ نرخ ها ی خطای در داده افزایی  هستند.

درصد خطا شبکه های عصبی معروف
نرخ خطای مربوط به شبکه ها ی عصبی مرسوم روی پایگاه ها ی داده Cifar10 و CIFar100 (منبع: DenseNet)

از شما برای خواندن این مطلب تشکر می کنم. امیدوارم این مطالب، بینشی در مورد داده افزایی فراهم کرده باشد. چنانچه سوالی داشتید در بخش نظرات با ما در ارتباط باشید.

در مورد نانوشبکه ها : نانوشبکه ها ی  APIهایی هستند که یادگیری عمیق برای توسعه دهندگان را تسهیل می کنند. می توانید آن ها را در سایت Nanonets مشاهده کنید.

0/5 (0 نظر)

درباره‌ی احمدرضا جعفری

همچنین ببینید

10 زبان برتر برنامه نویسی 2020

۱۰ زبان برنامه نویسی که باید در سال ۲۰۲۰ یاد بگیریم !

همان طور که می دانید جهان در حال تغییر است. امروزه با پیشرفت های سریع …

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *