کلاسه بندی تصویر با شبکه عصبی کانولوشنی ( CNN ) در Keras

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

۱- هدف

در مقاله قبلی در مورد کلاسه بندی تصویر ، ما از پرسپترون چند لایه در مجموعه داده ارقام MNIST استفاده کردیم. عملکرد بسیار خوب بود زیرا ما در داده های آزمایشی به دقت ۹۸٫۳ درصدی دست یافتیم. اما مشکلی در این رویکرد وجود داشت. در مجموعه داده های آموزشی ما ، تمام تصاویر در مرکز قرار دارند. اگر تصاویر مجموعه آزمایشی در مرکز قرار نگیرند ، روش MLP چندان موفق نخواهد بود. ما می خواهیم شبکه نسبت به تغییرات ایمن باشد.

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

اشتباه شبکه MLP با جابجا شدن نوشته در تصویر
اشتباه شبکه MLP با جابجا شدن نوشته در تصویر

شبکه کاملاً متصل سعی می کند ویژگی ها یا الگوهای کلی را بیاموزد. مشکل اصلی دیگر با یک کلاسه بند کاملاً متصل این است که تعداد پارامتر ها خیلی سریع افزایش می یابد زیرا هر گره در لایه L به یک گره در لایه L-1 متصل است. بنابراین طراحی شبکه های بسیار عمیق فقط با استفاده از یک ساختار MLP امکان پذیر نیست.

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

۲- شبکه عصبی کانولوشنی

شبکه های عصبی کانولوشنی نوعی شبکه عصبی پیشخور هستند. در شکل زیر یک طرح کلی از یک CNN متداول آورده شده است. قسمت اول شامل لایه های کانولوشنی و حداکثر تجمع ( max-pooling ) است که به عنوان استخراج کننده ویژگی عمل می کنند. قسمت دوم شامل لایه کاملاً متصل است که تبدیلات غیرخطی ویژگی های استخراج شده را انجام می دهد و به عنوان کلاسه بند عمل می کند.

شماتیک شبکه عصبی کانولوشنی
شماتیک شبکه عصبی کانولوشنی

در نمودار بالا ، ورودی به شبکه از لایه های Conv ، Pool و Dense عبور می کند. خروجی می تواند یک لایه softmax باشد که نشان دهد تصویر مربوط به یک گربه است یا چیز دیگر. همچنین می توانید یک لایه sigmoid داشته باشید تا احتمال گربه بودن تصویر را به شما بدهد. اجازه دهید این دو لایه را با جزئیات بیشتری بررسی کنیم.

۱-۲- لایه کانولوشنی

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

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

مثالی از کانولوشن ماتریس ها
مثالی از کانولوشن ماتریس ها

نمونه ای از عملیات کانولوشن روی یک ماتریس با اندازه ۵ × ۵ و فیلتر با اندازه ۳ × ۳ نشان داده شده است. فیلتر کانولوشن برای بدست آوردن نقشه فعالسازی روی کل ماتریس لغزش می کند.

بیایید به یک مثال مشخص نگاه کنیم و اصطلاحات را درک کنیم. فرض کنید، اندازه تصویر ورودی ۳۲x32x3 است که در واقع چیزی جز یک آرایه سه بعدی نیست. هر فیلتر کانولوشن که در این لایه تعریف می کنیم باید عمقی برابر با عمق ورودی داشته باشد. بنابراین می توانیم فیلتر های کانولوشن با عمق ۳ را انتخاب کنیم (به عنوان مثال ۳x3x3 یا ۵x5x3 یا ۷x7x3 و غیره). حالا اگر یک فیلتر کانولوشن با اندازه ۳x3x3 انتخاب کنیم، با اشاره به مثال فوق ، در اینجا فیلتر کانولوشن به جای مربع ، یک مکعب خواهد بود.

دیاگرام کانولوشن روی تصویر
دیاگرام کانولوشن روی تصویر

اگر بتوانیم با لغزاندن فیلتر ۳x3x3 روی کل تصویری با اندازه ۳۲x32x3 عملیات کانولوشن را انجام دهیم ، یک تصویر خروجی به اندازه ۳۰x30x1 بدست خواهیم آورد. دلیل این امر این است که عملیات کانولوشن برای نواری به عرض ۲ پیکسل در اطراف تصویر تعریف نشده است و ۱ پیکسل از چپ ، راست ، بالا و پایین تصویر نادیده گرفته می شود. بنابراین ما باید مطمئن شویم که فیلتر همیشه در داخل تصویر است و در واقع تمام تصویر را پوشش می دهد.

فیلترهای یکسان برای یافتن ویژگی های مربوطه روی کل تصویر کشیده می شوند. این باعث می شود شبکه CNN نسبت به تغییرات ثابت باشد.

۱-۱-۲- نقشه های فعالسازی

برای یک تصویر ورودی ۳۲x32x3 و اندازه فیلتر ۳x3x3 ، ما ۳۰x30x1 مکان یا پیکسل داریم و یک نورون مربوط به هر مکان وجود دارد. که ۳۰x30x1 خروجی یا فعالساز همه نورون های عصبی ، نقشه های فعالسازی نامیده می شوند. نقشه فعالسازی یک لایه ، به عنوان ورودی لایه بعدی عمل می کند.

۲-۱-۲- وزن ها و بایاس های تولید شده

در مثال ما ، ۳۰×۳۰ = ۹۰۰ نورون وجود دارد زیرا مکان های زیادی وجود دارد که می توان فیلتر ۳x3x3 را در آن اعمال کرد. بر خلاف شبکه های عصبی سنتی که وزن ها و بایاس های نورون ها از یکدیگر مستقل هستند ، در مورد CNN ها ، نورون های مربوط به یک فیلتر در یک لایه دارای وزن ها و بایاس های یکسانی هستند.

۳-۱-۲- گام حرکت فیلتر

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

۴-۱-۲- فیلترهای چندگانه

معمولا ما از بیش از ۱ فیلتر در یک لایه کانولوشنی استفاده می کنیم. اگر از ۳۲ فیلتر استفاده کنیم ، یک نقشه فعالسازی با اندازه ۳۰x30x32 خواهیم داشت. که می توانید شکل آن را در ادامه ملاحظه کنید.

توجه داشته باشید که تمام نورون های عصبی مرتبط با یک فیلتر دارای وزن ها و بایاس های یکسانی هستند. بنابراین تعداد وزن هنگام استفاده از ۳۲ فیلتر به ۳x3x3x32 = 288 و تعداد بایاس ها به ۳۲ می رسد.

نقسه فعال سازی برای 32 کرنل
نقسه فعال سازی برای ۳۲ کرنل

۳۲ نقشه فعالسازی به دست آمده ، حاصل اعمال کرنل های کانولوشنی می باشد.

۵-۱-۲- لایه گذاری با صفر

همانطور که مشاهده می کنید ، پس از هر کانولوشن ، اندازه خروجی کاهش می یابد (همانطور که ما در این مثال از ۳۲×۳۲ به ۳۰×۳۰ رسیدیم). برای سهولت ، یک روش استاندارد است که صفرها را در مرز و اطراف تصویر ورودی لایه گذاری می کند ، به طوری که خروجی با ورودی هم اندازه باشد. بنابراین ، در این مثال ، اگر یک لایه گذاری به اندازه ۱ در هر دو طرف لایه ورودی اضافه کنیم ، اندازه لایه خروجی ۳۲x32x32 خواهد بود که پیاده سازی را نیز ساده تر می کند. فرض کنید شما ورودی به اندازه NxN ، یک فیلتر به اندازه F دارید و گام S استفاده می کنید و یک لایه گذاری با صفر به اندازه P به تصویر ورودی اضافه می شود. سپس ، خروجی به اندازه MxM خواهد بود که M = ((N-F + 2P) / S) + 1

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

۲-۲- CNN ویژگی های سلسله مراتبی را یاد می گیرد

بیایید ببینیم که چگونه CNN ویژگی های سلسله مراتبی را یاد می گیرد.

ویژگی های سلسله مراتبی CNN
ویژگی های سلسله مراتبی CNN

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

  • در لایه اول ، مربع شماره ۱ از ناحیه ای که در تصویر برگ است ، بدست می آید.
  • در لایه دوم ، مربع شماره ۲ از مربع بزرگتر در لایه ۱ بدست می آید. اعداد در این مربع از مناطق مختلف از تصویر ورودی بدست می آیند. به طور خاص ، کل اطراف گوش چپ گربه مربوط به مقدار در مربع شماره ۲ است.
  • به همین ترتیب ، در لایه سوم ، این اثر آبشاری باعث می شود مربع شماره ۳ از یک ناحیه بزرگ در اطراف ناحیه پا بدست آید.

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

۳-۲- لایه حداکثر تجمع

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

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

متداول ترین شکل تجمع ، حداکثر تجمع ( Max Pooling ) است که در آن با استفاده از یک فیلتر به اندازه p ، عملگر ماکسیمم گیری را روی تمام قسمت های تصویر که هم اندازه با فیلتر هستند اعمال می کنیم.

لایه Max Pooling
لایه Max Pooling

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

حال بیایید از بحث نظری خارج شویم و به پیاده سازی CNN بپردازیم.

۳- پیاده سازی CNN در Keras

۱-۳- مجموعه داده – CIFAR10

مجموعه CIFAR10 به همراه Keras ارائه می شود. دارای ۵۰۰۰۰ تصویر آموزشی و ۱۰۰۰۰ عکس آزمایشی با اندازه ۳۲ × ۳۲  است. ۱۰ کلاس شامل هواپیما ، اتومبیل ، پرنده ، گربه ، آهو ، سگ ، قورباغه ، اسب ، کشتی و کامیون است و در ادامه چند مثال از آن آورده شده است.

تصاویر نمونه از مجموعه CIFAR10
تصاویر نمونه از مجموعه CIFAR10

۲-۳- شبکه

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

from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Conv2D, MaxPooling2D, Dropout, Flatten

def createModel():
    model = Sequential()
    # The first two layers with 32 filters of window size 3x3
    model.add(Conv2D(32, (3, 3), padding='same', activation='relu', input_shape=input_shape))
    model.add(Conv2D(32, (3, 3), activation='relu'))
    model.add(MaxPooling2D(pool_size=(2, 2)))
    model.add(Dropout(0.25))

    model.add(Conv2D(64, (3, 3), padding='same', activation='relu'))
    model.add(Conv2D(64, (3, 3), activation='relu'))
    model.add(MaxPooling2D(pool_size=(2, 2)))
    model.add(Dropout(0.25))

    model.add(Conv2D(64, (3, 3), padding='same', activation='relu'))
    model.add(Conv2D(64, (3, 3), activation='relu'))
    model.add(MaxPooling2D(pool_size=(2, 2)))
    model.add(Dropout(0.25))

    model.add(Flatten())
    model.add(Dense(512, activation='relu'))
    model.add(Dropout(0.5))
    model.add(Dense(nClasses, activation='softmax'))
    
    return model

در کد بالا ، ما از ۶ لایه کانولوشنی و ۱ لایه کاملاً متصل استفاده می کنیم. خط ۶ و ۷ لایه های کانولوشنی را با ۳۲ فیلتر یا کرنل با اندازه ۳ × ۳ اضافه می کند. به همین ترتیب ، در خط ۱۰ ، یک لایه کانولوشنی با ۶۴ فیلتر اضافه می کنیم. در خط ۸ ، یک لایه حداکثر تجمع با اندازه پنجره ۲ × ۲ اضافه می کنیم. در خط ۹ ، یک لایه Dropout با نسبت ۰٫۲۵ اضافه می کنیم. در خطوط آخر ، لایه متراکم را اضافه می کنیم تا کلاسه بندی را در بین ۱۰ کلاس با استفاده از یک لایه softmax انجام دهد.

اگر خلاصه مدل را بررسی کنیم می توان اندازه و شکل هر لایه را مشاهده کرد.

خلاصه مدل CNN در Keras روی مجموعه تصاویر CIFAR10
خلاصه مدل CNN در Keras روی مجموعه تصاویر CIFAR10

این نشان می دهد که از آنجایی که ما در لایه اول از تجمع ( padding ) استفاده کردیم ، شکل خروجی و ورودی برابر است (۳۲ × ۳۲). اما لایه کانولوشنی دوم در هر دو بُعد ۲ پیکسل کوچک می شود. همچنین ، اندازه خروجی پس از لایه تجمع ، نصف می شود ، زیرا ما از یک گام ۲ و اندازه پنجره ۲ × ۲ استفاده کرده ایم. لایه خروجی نهایی دارای خروجی ۲x2x64 است که باید به یک آرایه واحد تبدیل شود. این کار توسط لایه flatten انجام می شود که آرایه سه بعدی را به یک آرایه یک بعدی با اندازه ۲x2x64 = 256 تبدیل می کند. لایه نهایی دارای ۱۰ واحد است زیرا مجموعه داده ما شامل ۱۰ کلاس است.

۳-۳- آموزش شبکه

برای آموزش شبکه ، ما از دستورالعمل ساده create -> compile -> fit پیروی خواهیم کرد. از آنجا که این یک مسئله کلاسه بندی ۱۰ کلاسه است ، ما از categorical cross-entropy به عنوان ضرر یا زیان استفاده خواهیم کرد و برای آموزش شبکه از بهینه ساز RMSProp استفاده می کنیم. باید آن را برای چند تعداد دوره (epoch) مختلف اجرا کنیم. در اینجا آن را برای ۱۰۰ دوره اجرا کرده ایم.

# Initialize the model
model1 = createModel()

# Set training process params
batch_size = 256
epochs = 50

# Set the training configurations: optimizer, loss function, accuracy metrics
model1.compile(optimizer='rmsprop', loss='categorical_crossentropy', metrics=['accuracy'])

history = model1.fit(train_data,
                     train_labels_one_hot,
                     batch_size=batch_size, 
                     epochs=epochs, verbose=1, 
                     validation_data=(test_data, test_labels_one_hot)
          )

# Check the model results on the test set
model1.evaluate(test_data, test_labels_one_hot)

۴-۳- منحنی های از زیان و دقت

در ادامه منحنی های زیان و دقت نشان داده شده اند.

# Loss Curves
plt.figure(figsize=[8,6])
plt.plot(history.history['loss'],'r',linewidth=3.0)
plt.plot(history.history['val_loss'],'b',linewidth=3.0)
plt.legend(['Training loss', 'Validation Loss'],fontsize=18)
plt.xlabel('Epochs ',fontsize=16)
plt.ylabel('Loss',fontsize=16)
plt.title('Loss Curves',fontsize=16)

# Accuracy Curves
plt.figure(figsize=[8,6])
plt.plot(history.history['accuracy'],'r',linewidth=3.0)
plt.plot(history.history['val_accuracy'],'b',linewidth=3.0)
plt.legend(['Training Accuracy', 'Validation Accuracy'],fontsize=18)
plt.xlabel('Epochs ',fontsize=16)
plt.ylabel('Accuracy',fontsize=16)
plt.title('Accuracy Curves',fontsize=16)

نمودار ضرر CNN
نمودار ضرر CNN
نمودار دقت CNN
نمودار دقت CNN

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

۴- استفاده از داده افزایی

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

from tensorflow.keras.preprocessing.image import ImageDataGenerator
 
ImageDataGenerator(
    rotation_range=10.,
    width_shift_range=0.1,
    height_shift_range=0.1,
    shear_range=0.,
    zoom_range=.1.,
    horizontal_flip=True,
    vertical_flip=True)

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

داده افزایی تصاویر گربه
داده افزایی تصاویر گربه

۱-۴- آموزش با داده افزایی

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

from tensorflow.keras.preprocessing.image import ImageDataGenerator
 
# Initialize the model
model2 = createModel()

model2.compile(optimizer='rmsprop', loss='categorical_crossentropy', metrics=['accuracy'])

# Set training process params
batch_size = 256
epochs = 50

# Define transformations for train data
datagen = ImageDataGenerator(
        width_shift_range=0.1,  # randomly shift images horizontally (fraction of total width)
        height_shift_range=0.1,  # randomly shift images vertically (fraction of total height)
        horizontal_flip=True,  # randomly flip images
        vertical_flip=False)  # randomly flip images

# Fit the model on the batches generated by datagen.flow().
history2 = model2.fit(datagen.flow(train_data, train_labels_one_hot, batch_size=batch_size),
                      steps_per_epoch=int(np.ceil(train_data.shape[0] / float(batch_size))),
                      epochs=epochs,
                      validation_data=(test_data, test_labels_one_hot),
                      workers=4
           )

model2.evaluate(test_data, test_labels_one_hot)

در کد بالا :

  1. ابتدا مدل را ایجاد می کنیم و آن را پیکربندی می کنیم.
  2. سپس یک ImageDataGenerator ایجاد می کنیم و پارامترهای آن را تنظیم می کنیم.
  3. تابع ()flow پس از انجام تبدیل و افزایش داده های مشخص شده ، دسته ای از داده ها را تولید می کند.
  4. تابع fit_generator با استفاده از داده های به دست آمده از تابع flow مدل را آموزش می دهد.

۲-۴- منحنی های زیان و دقت

# Loss Curves
plt.figure(figsize=[8,6])
plt.plot(history2.history['loss'],'r',linewidth=3.0)
plt.plot(history2.history['val_loss'],'b',linewidth=3.0)
plt.legend(['Training loss', 'Validation Loss'],fontsize=18)
plt.xlabel('Epochs ',fontsize=16)
plt.ylabel('Loss',fontsize=16)
plt.title('Loss Curves',fontsize=16)

# Accuracy Curves
plt.figure(figsize=[8,6])
plt.plot(history2.history['accuracy'],'r',linewidth=3.0)
plt.plot(history2.history['val_accuracy'],'b',linewidth=3.0)
plt.legend(['Training Accuracy', 'Validation Accuracy'],fontsize=18)
plt.xlabel('Epochs ',fontsize=16)
plt.ylabel('Accuracy',fontsize=16)
plt.title('Accuracy Curves',fontsize=16)

نمودار تابع ضرر CNN
نمودار تابع ضرر CNN
نمودار تابع دقت CNN
نمودار تابع دقت CNN

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

۵- کلام آخر

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

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

بیشتر بخوانید :

منبع Learn OpenCV

درباره‌ی امیر اقتدائی

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

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

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

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

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

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