از طریق منوی جستجو مطلب مورد نظر خود در وبلاگ را به سرعت پیدا کنید
RandAugment برای طبقه بندی تصویر با Keras/TensorFlow
سرفصلهای مطلب
افزایش داده برای مدت طولانی به عنوان وسیله ای برای جایگزینی یک مجموعه داده “ایستا” با انواع تبدیل شده عمل می کند و تغییر ناپذیری را تقویت می کند. شبکه های عصبی کانولوشن (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
به آن، چندین بار و نگاهی به نتایج:
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'))
لایه دارای یک 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
– افزایش بسیار تهاجمی کمتری خواهید دید:
لایه بودن – می توان از آن در مدل ها یا در داخل استفاده کرد 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
کمک می کند:
در خط لوله غیرافزوده، شبکه بیش از حد مناسب می شود (دقت آموزش به سقف می رسد) و دقت اعتبارسنجی پایین می ماند. در خط لوله تقویت شده، دقت آموزش از ابتدا تا انتها کمتر از دقت اعتبار سنجی باقی می ماند.
با تلفات آموزشی بیشتر، شبکه از اشتباهاتی که هنوز مرتکب میشود بسیار آگاهتر است و میتوان بهروزرسانیهای بیشتری انجام داد تا آن را نسبت به تحولات تغییر ندهد. اولی نیازی به به روز رسانی نمی بیند، در حالی که دومی انجام می دهد و سقف پتانسیل را بالا می برد.
نتیجه
KerasCV یک بسته جداگانه است، اما همچنان یک افزودنی رسمی به Keras است که توسط تیم Keras توسعه یافته است، با هدف ارائه CV با قدرت صنعتی به پروژه های Keras شما. KerasCV هنوز در حال توسعه است و در حال حاضر شامل 27 لایه پیش پردازش جدید است. RandAugment
، CutMix
، و MixUp
برخی از آنها بودن
در این راهنمای کوتاه، نگاهی به روش استفاده شما انداخته ایم RandAugment
برای اعمال تعدادی تبدیل تصادفی از یک لیست داده شده از تبدیل های کاربردی، و چقدر آسان است که در هر خط لوله آموزشی Keras گنجانده شود.
(برچسبها به ترجمه)# python
منتشر شده در 1403-01-03 13:30:04