خانه > مقالات آموزشی > پیاده سازی شبکه عمیق در متلب: ساختن شبکه یادگیری عمیق ساده برای کلاسه بندی

پیاده سازی شبکه عمیق در متلب: ساختن شبکه یادگیری عمیق ساده برای کلاسه بندی

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

در این مثال موارد زیر آموزش داده شده است:

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

۱٫ بارگزاری و جست وجوی داده های تصویری

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

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

figure;

perm = randperm(10000,20);

for i = 1:20  

subplot(4,5,i);

    imshow(digitData.Files{perm(i)});

end

برای محاسبه ی تعداد تصاویر در هر کلاس( پوشه ) می توان از دستور countEachLabel به صورت زیر استفاده کرد :

labelCount = countEachLabel(digitData)

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

CountLable
01000
11000
21000
31000
41000
51000
61000
71000
81000
91000

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

img = readimage(digitData,1);
size(img)

نتیجه به صورت زیر است:

ans = 1×۲     28    28

یعنی تصویر دو بعدی و یک کاناله است و ابعاد آن هم ۲۸*۲۸ است.

۲٫ تعیین مجموعه داده های آموزش و راستی آزمایی

داده ها را به دو دسته ی آموزش و راستی آزمایی تقسیم کنید. از هرکلاس، ۷۵۰ داده را برای آموزش اختصاص دهید و از بقیه ی داده ها را به عنوان داده های راستی آزمایی در نظر بگیرید. با استفاده از دستور splitEachLabel می توانید این کار را انجام دهید. مطابق کد زیر، داده های آموزش و داده های راستی آزمایی در  trainDigitData  وvalDigirData قرارداده خواهند شد.

trainNumFiles = 750;
[trainDigitData,valDigitData] = splitEachLabel(digitData,trainNumFiles,'randomize');

۳٫ تعریف ساختار شبکه

در این مرحله ساختار شبکه ی کانولوشن را تعریف می کنیم. در مورد لایه های تشکیل دهنده ی شبکه کانولوشن در درسنامه های قبل توضیحاتی ارائه شده است.

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

layers = [
imageInputLayer([28 28 1])

convolution2dLayer(3,16,'Padding',1)
batchNormalizationLayer
reluLayer

maxPooling2dLayer(2,'Stride',2)

convolution2dLayer(3,32,'Padding',1)
batchNormalizationLayer
reluLayer

maxPooling2dLayer(2,'Stride',2)

convolution2dLayer(3,64,'Padding',1)
batchNormalizationLayer
reluLayer

fullyConnectedLayer(10)
softmaxLayer
classificationLayer];

۴٫ تعریف ویژگی های آموزش

بعد از تعریف ساختارشبکه، ویژگی های آموزش را تعیین می کنیم. منظور از ویژگی های آموزش، تنظیم پارامترهای شبکه برای فرآیند آموزش است. مثلا در این مثال برای آموزش از روش گرادیان نزولی با گشتاور(SGDM) با نرخ یادگیری ۰٫۰۱ استفاده شده است. بیشترین تعداد دفعات تکراررفرآیند آموزش ۴ تعیین شده است. تعریف این پارامترها به صورت زیر انجام می شود:

options = trainingOptions('sgdm',...
'MaxEpochs',3, ...
'ValidationData',valDigitData,...
'ValidationFrequency',30,...
'Verbose',false,...
'Plots','training-progress');

۵٫ آموزش شبکه با داده های آموزش

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

net = trainNetwork(trainDigitData,layers,options);


کلاسه بندی داده های راستی آزمایی و محاسبه صحت کار

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

predictedLabels = classify(net,valDigitData);
valLabels = valDigitData.Labels;

accuracy = sum(predictedLabels == valLabels)/numel(valLabels)

که نتیجه ی آن به صورت زیر خواهد بود:

accuracy = 0.9976

درباره‌ی حسین غلامعلی نژاد

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

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

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

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

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

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