وبلاگ رسانگار
با ما حرفه ای باشید

سرور مجازی NVMe

RandAugment برای طبقه بندی تصویر با Keras/TensorFlow

0 5
زمان لازم برای مطالعه: 6 دقیقه


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

توجه داشته باشید: تغییر ناپذیری به کور کردن مدل ها نسبت به اختلالات خاص در هنگام تصمیم گیری خلاصه می شود. اگر آن را آینه کنید یا بچرخانید، تصویر گربه همچنان تصویری از گربه است.

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

انواع افزایش

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

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

KerasCV و RandAugment

KerasCV یک بسته جداگانه است، اما همچنان یک اضافه رسمی به Keras است که توسط تیم Keras توسعه یافته است. این به این معنی است که همان مقدار جلا و وضوح بسته اصلی را دارد، اما با مدل‌های معمولی Keras و لایه‌های آن‌ها نیز بی‌نظیر ادغام می‌شود. تنها تفاوتی که تا به حال متوجه خواهید شد تماس گرفتن است keras_cv.layers... بجای keras.layers....

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

ابتدا نصب کنید keras_cv:

$ pip install keras_cv

توجه داشته باشید: KerasCV برای کار کردن به TensorFlow 2.9 نیاز دارد. اگر قبلاً آن را ندارید، اجرا کنید $ pip install -U tensorflow اولین.

حالا وقته import TensorFlow، Keras و KerasCV، در کنار مجموعه داده های TensorFlow برای دسترسی آسان به Imagenette:

import tensorflow as tf
from tensorflow import keras
import keras_cv
import tensorflow_datasets as tfds

بیایید یک تصویر بارگذاری کنیم و آن را به شکل اصلی نمایش دهیم:

import matplotlib.pyplot as plt
import cv2

cat_img = cv2.cvtColor(cv2.imread('cat.jpg'), cv2.COLOR_BGR2RGB)
cat_img = cv2.resize(cat_img, (224, 224))
plt.imshow(cat_img)

RandAugment برای طبقه بندی تصویر با Keras/TensorFlow

حالا بیایید درخواست کنیم RandAugment به آن، چندین بار و نگاهی به نتایج:

fig = plt.figure(figsize=(10,10))
for i in range(16):
    ax = fig.add_subplot(4,4,i+1)
    aug_img = keras_cv.layers.RandAugment(value_range=(0, 255))(cat_img)
    
    ax.imshow(aug_img.numpy().astype('int'))

RandAugment برای طبقه بندی تصویر با Keras/TensorFlow

لایه دارای یک magnitude آرگومان، که به طور پیش فرض به 0.5 و می توان آن را برای افزایش یا کاهش اثر افزایش تغییر داد:

fig = plt.figure(figsize=(10,10))
for i in range(16):
    ax = fig.add_subplot(4,4,i+1)
    aug_img = keras_cv.layers.RandAugment(value_range=(0, 255), magnitude=0.1)(cat_img)
    ax.imshow(aug_img.numpy().astype('int'))

وقتی روی مقدار کم تنظیم می شود مانند 0.1 – افزایش بسیار تهاجمی کمتری خواهید دید:

RandAugment برای طبقه بندی تصویر با Keras/TensorFlow

لایه بودن – می توان از آن در مدل ها یا در داخل استفاده کرد tf.data خطوط لوله هنگام ایجاد مجموعه داده ها این باعث می شود RandAugment بسیار انعطاف پذیر! استدلال های اضافی هستند augmentations_per_image و rate استدلال هایی که با هم کار می کنند.

برای 0...augmentations_per_image، لایه یک لایه پیش پردازش تصادفی به خط لوله اضافه می کند تا روی یک تصویر اعمال شود. در مورد پیش فرض 3 – سه عملیات مختلف به خط لوله اضافه شده است. سپس، یک عدد تصادفی برای هر افزایش در خط لوله نمونه برداری می شود – و اگر کمتر از rate (پیش فرض به اطراف است 0.9) – افزایش اعمال می شود.

در اصل – به احتمال 90٪ هر افزایش (تصادفی) در خط لوله روی تصویر اعمال می شود.

این به طور طبیعی به این معنی است که همه تقویت‌ها نباید اعمال شوند، به خصوص اگر میزان را پایین بیاورید rate. همچنین می‌توانید عملیات مجاز را از طریق a سفارشی کنید RandomAugmentationPipeline لایه، که RandAugment مورد خاص است. راهنمای جداگانه روی RandomAugmentationPipeline به زودی منتشر خواهد شد.

آموزش Classifier با و بدون RandAugment

برای ساده سازی جنبه آماده سازی/بارگیری داده ها و تمرکز روی RandAugment، استفاده کنیم tfds برای بارگیری در بخشی از Imagenette:

(train, valid_set, test_set), info = tfds.load("imagenette", 
                                           split=("train(:70%)", "validation", "train(70%:)"),
                                           as_supervised=True, with_info=True)

class_names = info.features("label").names
n_classes = info.features("label").num_classes
print(f'Class names: {class_names}') 
print('Num of classes:', n_classes) 

print("Train set size:", len(train)) 
print("Test set size:", len(test_set)) 
print("Valid set size:", len(valid_set)) 

ما فقط بخشی از داده‌های آموزشی را در آن بارگذاری کرده‌ایم تا در دوره‌های کمتری به مجموعه داده‌ها اضافه شود (در واقع آزمایش ما سریع‌تر اجرا شود). از آنجایی که تصاویر در Imagenette اندازه های متفاوتی دارند، اجازه دهید a ایجاد کنیم preprocess() تابعی که اندازه آنها را تغییر می دهد تا مجموعه داده را با آن ترسیم کند، و همچنین یک augment() عملکردی که تصاویر را در a تقویت می کند tf.data.Dataset:

def preprocess(images, labels):
  return tf.image.resize(images, (224, 224)), tf.one_hot(labels, 10)
  
def augment(images, labels):
  inputs = {"images": images, "labels": labels}
  outputs = keras_cv.layers.RandAugment(value_range=(0, 255))(inputs)
  return outputs('images'), outputs('labels')

اکنون – ما برچسب ها را یکباره کدگذاری کردیم. ما لزوماً مجبور نبودیم، اما برای افزایش مانند CutMix باید برچسب ها و نسبت آنها را دستکاری کنید. از آنجایی که ممکن است بخواهید آنها را نیز اعمال کنید RandAugment برای ایجاد طبقه‌بندی‌کننده‌های قوی با آنها بسیار خوب کار می‌کند – اجازه دهید رمزگذاری یک‌طرفه را وارد کنیم. RandAugment یک فرهنگ لغت با تصاویر و برچسب‌ها دقیقاً به همین دلیل است – برخی از افزودنی‌هایی که می‌توانید اضافه کنید در واقع برچسب‌ها را تغییر می‌دهند، بنابراین اجباری هستند. می توانید تصاویر و برچسب های افزوده شده را از آن استخراج کنید outputs فرهنگ لغت به راحتی، بنابراین این یک مرحله اضافی و در عین حال ساده است که در حین تقویت باید برداشته شود.

بیایید مجموعه داده های موجود برگردانده شده از را نقشه برداری کنیم tfds با preprocess() عملکرد، آنها را دسته بندی کنید و فقط مجموعه آموزشی را تقویت کنید:

valid_set = valid_set.map(preprocess).batch(32).prefetch(tf.data.AUTOTUNE)
train_set = train.map(preprocess).batch(32).prefetch(tf.data.AUTOTUNE)
train_set_aug = train.map(preprocess).map(augment_data, 
                                          num_parallel_calls=tf.data.AUTOTUNE).batch(32).prefetch(tf.data.AUTOTUNE)

بیایید یک شبکه آموزش دهیم! keras_cv.models دارای برخی شبکه های داخلی، مشابه keras.applications. در حالی که لیست هنوز کوتاه است – در طول زمان گسترش می یابد و همه چیز را به دست می گیرد keras.applications. API بسیار شبیه است، بنابراین انتقال کد برای اکثر پزشکان نسبتاً آسان خواهد بود:


effnet = keras_cv.models.EfficientNetV2B0(include_rescaling=True, include_top=True, classes=10)
          
effnet.compile(
    loss='categorical_crossentropy',
    optimizer='adam',
    metrics=('accuracy')
)

history = effnet.fit(train_set, epochs=25, validation_data = valid_set)

به طور متناوب، می توانید از جریان استفاده کنید keras.applications:

effnet = keras.applications.EfficientNetV2B0(weights=None, classes=10)

effnet.compile(
  loss='categorical_crossentropy',
  optimizer='adam',
  metrics=('accuracy')
)

history1 = effnet.fit(train_set, epochs=50, validation_data=valid_set)

این منجر به مدلی می شود که واقعاً خوب عمل نمی کند:

Epoch 1/50
208/208 (==============================) - 60s 238ms/step - loss: 2.7742 - accuracy: 0.2313 - val_loss: 3.2200 - val_accuracy: 0.3085
...
Epoch 50/50
208/208 (==============================) - 48s 229ms/step - loss: 0.0272 - accuracy: 0.9925 - val_loss: 2.0638 - val_accuracy: 0.6887

حالا بیایید همان تنظیمات شبکه را آموزش دهیم روی مجموعه داده افزوده شده هر دسته به‌صورت جداگانه افزوده می‌شود، بنابراین هر زمان که دسته‌ای از تصاویر (در دوره بعدی) به‌وجود آمد – تقویت‌های متفاوتی خواهند داشت:

effnet = keras.applications.EfficientNetV2B0(weights=None, classes=10)
effnet.compile(
  loss='categorical_crossentropy',
  optimizer='adam',
  metrics=('accuracy')
)

history2 = effnet.fit(train_set_aug, epochs=50, validation_data = valid_set)
Epoch 1/50
208/208 (==============================) - 141s 630ms/step - loss: 2.9966 - accuracy: 0.1314 - val_loss: 2.7398 - val_accuracy: 0.2395
...
Epoch 50/50
208/208 (==============================) - 125s 603ms/step - loss: 0.7313 - accuracy: 0.7583 - val_loss: 0.6101 - val_accuracy: 0.8143

خیلی بهتر! در حالی که شما هنوز می خواهید از افزایش های دیگر مانند CutMix و MixUp، در کنار سایر تکنیک های آموزشی برای به حداکثر رساندن دقت شبکه – فقط RandAugment به طور قابل توجهی کمک کرد و می تواند با یک خط لوله تقویت طولانی تر قابل مقایسه باشد.

اگر منحنی های تمرین را از جمله آموزش مقایسه کنید و منحنی های اعتبارسنجی – فقط مشخص می شود که چقدر است RandAugment کمک می کند:

RandAugment برای طبقه بندی تصویر با Keras/TensorFlow

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

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

نتیجه

KerasCV یک بسته جداگانه است، اما همچنان یک افزودنی رسمی به Keras است که توسط تیم Keras توسعه یافته است، با هدف ارائه CV با قدرت صنعتی به پروژه های Keras شما. KerasCV هنوز در حال توسعه است و در حال حاضر شامل 27 لایه پیش پردازش جدید است. RandAugment، CutMix، و MixUp برخی از آنها بودن

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

(برچسب‌ها به ترجمه)# python



منتشر شده در 1403-01-03 13:30:04

امتیاز شما به این مطلب
دیدگاه شما در خصوص مطلب چیست ؟

آدرس ایمیل شما منتشر نخواهد شد.

لطفا دیدگاه خود را با احترام به دیدگاه های دیگران و با توجه به محتوای مطلب درج کنید