در این درسنامه که ترجمه ی یکی از مثال های موجود در متلب است، نشان می دهیم که چگونه می توان یک شبکه عصبی کانولوشن ساده را برای کلاسه بندی آموزش عمیق ساخته و آموزش دهیم. شبکه های عصبی عمیق، ابزاری ضروری برای یادگیری عمیق هستند و عموما از آن برای بازشناسی تصویر استفاده می کنند.
مقاله مرتبط :
- پیاده سازی شبکه عمیق در متلب: ساختن شبکه یادگیری عمیق ساده برای کلاسه بندی
- پیاده سازی شبکه عصبی عمیق در متلب – قسمت اول : کانولوشن
- پیاده سازی شبکه عصبی عمیق در متلب – قسمت دوم : پولینگ
- پیاده سازی شبکه عصبی عمیق در متلب – قسمت سوم : تماماً متصل
- پیاده سازی شبکه عصبی عمیق در متلب – قسمت چهارم : الگوریتم پس انتشار
در این مثال موارد زیر آموزش داده شده است:
- بارگزاری و جست وجوی داده های تصویری
- تعریف ساختار شبکه
- تعیین داده های آموزش و راستی آزمایی
- پیش بینی شماره کلاس برای یک داده ی جدید و محاسبه ضریب دقت کلاسه بندی
۱ – بارگزاری و جست وجوی داده های تصویری
نمونه های رقمی را به صورت یک مجموعه داده که داده های هرکلاس در یک پوشه با یک شماره ی مشخص قرارداده شده اند، بارگزاری کنید. دستور 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)
وقتی دستور فوق را تایپ کنیم، نتیجه بصورت زیر خواهدشد :
Count | Lable |
0 | 1000 |
1 | 1000 |
2 | 1000 |
3 | 1000 |
4 | 1000 |
5 | 1000 |
6 | 1000 |
7 | 1000 |
8 | 1000 |
9 | 1000 |
برای ورود اطلاعات به شبکه عصبی عمیق، ابعاد تصاویر باید یکسان و تعیین شده باشد. برای پایگاه داده ی مورد استفاده از دستور زیر برای دانستن ابعاد اولین تصویر استفاده می کنیم :
img = readimage(digitData,1); size(img)
نتیجه به صورت زیر است:
ans = 1×۲ ۲۸ ۲۸
یعنی تصویر دو بعدی و یک کاناله است و ابعاد آن هم ۲۸*۲۸ است.
۲ – تعیین مجموعه داده های آموزش و راستی آزمایی
داده ها را به دو دسته ی آموزش و راستی آزمایی تقسیم کنید. از هرکلاس، ۷۵۰ داده را برای آموزش اختصاص دهید و از بقیه ی داده ها را به عنوان داده های راستی آزمایی در نظر بگیرید. با استفاده از دستور 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
داشتم در مورد یک موردی برای پیاده سازی شبکه های عصبی سرچ می کردم یهو دیدم سایت شهاب بالا اومد .
خیللللی خوش حال شدم .
ایول اگر همین طور ادامه بدین تبدیل میشین به یکی از سایتهای مرجع در زمینه هوش مصنوعی
لطف دارین جناب خیری
ما هم امیدواریم که بتونیم مطالب خوب و مناسبی برای شما ارائه کنیم و آموزش هایی که میذاریم برای شما مفید باشه
مختصر و مفید!
خیلی خوب بود.
با تشکر از زحمات شما.
سلام خدمت عزیزان متولی سایت شهاب
آموزشهاتون خیلی روان است واقعا این کار هنرمندانه است تبریک میگم. سایتهایی مثل سایت شما که جاذب افراد هستند و آینده ی[وبی انشا الله داشته باشند و مطالب مفید ارائه میکنند یک آیکون Donate داشته باشید برای کسانی که بخوان از زحمات شما تشکر کنند برای توانایی ادامه فعالیت و خدمت به جامعه ی علمی.
خدا قوت دلاوران.
سلام
خیلی ممنون که با ما همراه هستید. باعث افتخار و خوشحالی ماست که مطالب سایت ما برای شما مفید بوده.
از پیشنهادی که دادید هم ممنونم. تا الان ما هدفمون از کار مجله مالی نبوده و صرفا برای کمک به محقق ها و علاقمندان ها به حوزه هوش مصنوعی و پردازش تصویر این مطالب رو ارائه می کردیم. ولی شاید در آینده پیشنهاد شما رو هم در نظر بگیریم.
انشاالله موفق باشید.