پرسپترون چند لایه که به اختصار MLP: Multilayer Perceptron نامیده میشود، زیرمجموعهای از شبکههای عصبی مصنوعی پیشخور (Feedforward) است که حداقل از سه لایه تشکیل شدهاست. این سه لایه عبارتند از لایه ورودی (Input Layer)، لایه پنهان (Hidden Layer) و لایه خروجی (Output Layer). شبکه عصبی MLP یک روش یادگیری نظارت شده (Supervised Learning) است که برای طبقهبندی دادگانی که به صورت خطی قابل تفکیک نیستند، استفاده میشود. در این مقاله، ابتدا شبکه عصبی MLP برای طبقهبندی دادگان MNIST در نرمافزار متلب (MATLAB) پیادهسازی خواهد شد و سپس برخی از پارامترهای آن مورد بررسی قرار میگیرید.
فهرست مطالب
دادگان MNIST
دیتاست یا دادگان MNIST ارقام 0 تا 9 هستند که 60000 داده به همراه لیبل به دادگان آموزش و 10000 داده به همراه لیبل به دادگان تست اختصاص داده شدهاست. هر داده یک تصویر 28x28 پیکسل است. دادگان MNIST شامل 4 فایل به صورت زیر است:
- دادگان آموزش (train-images.idx3-ubyte)
- لیبل دادگان آموزش (train-labels.idx1-ubyte)
- دادگان تست (t10k-images.idx3-ubyte)
- لیبل دادگان تست (t10k-labels.idx1-ubyte)
دیتاست MNIST را میتوانید از مراجع مختلف دانلود نمایید.
پیادهسازی شبکه عصبی MLP
دادگان MNIST دارای ساختار و فرمت ویژهای هستند که خواندن و کار با آن کمی متفاوت است. کد زیر، تابع LoadData را نشان میدهد که برای خواندن و استفاده از این دادگان نوشته شدهاست.
%LoadData Function
function [Data,Label]=LoadData(DataPath,LabelPath)
fid1=fopen(DataPath,'r');
fid2=fopen(LabelPath,'r');
%Magic Number
Var=fread(fid1,1,'uint32');
Var=fread(fid2,1,'uint32');
%Number of Data
Var=fread(fid1,1,'uint32');
AllData=swapbytes(uint32(Var));
Var=fread(fid2,1,'uint32');
%Number of Rows
Var=fread(fid1,1,'uint32');
NumRows=swapbytes(uint32(Var));
%Number of Columns
Var=fread(fid1,1,'uint32');
NumColumns=swapbytes(uint32(Var));
%Create Data Matrix
Data=zeros(NumRows,NumColumns,AllData,'uint8');
for k=1:AllData
%Read NumRows*NumColumns Pixels at a Time
Var=fread(fid1,NumRows*NumColumns,'uint8');
Data(:,:,k)=reshape(uint8(Var),NumColumns,NumRows).';
end
%Data Labels
Label=fread(fid2,AllData,'uint8');
%Close the Files
fclose(fid1);
fclose(fid2);
end
جدول زیر متغییرها و توابع استفاده شده در تابع LoadData را نمایش میدهد.
متغییرها و توابع | توضیح |
Data | ویژگی (Feature) دادگان (بدون لیبل) |
Label | لیبلهای متناظر با دادگان |
LoadData | نام تابع |
DataPath | مسیر فایل دادگان |
LabelPath | مسیر فایل لیبلها |
fopen | باز کردن فایل |
AllData | تعداد تمام دادگان |
NumRows | تعداد سطرها (28) |
NumColumns | تعداد ستونها (28) |
fclose | بستن فایل |
شبکه عصبی MLP که در این مقاله برای طبقهبندی دادگان MNIST استفاده میشود، دارای 3 لایه است. لایه اول که Input Layer نام دارد دارای 784 یونیت است که به تعداد پیکسلهای هر داده میباشد. در واقع هر پیکسل یک ویژگی (Feature) است. لایه دوم Hidden Layer است که تعداد یونیتهای آن میتواند متغییر باشد. لایه سوم نیز Output Layer است که دارای 10 یونیت است. هر یونیت در لایه سوم نشانگر یک لیبل (یک رقم از 0 تا 9) است. شکل 1 ساختار این شبکه عصبی MLP را نمایش میدهد.
شکل 1 - شبکه عصبی MLP برای طبقهبندی دادگان MNIST
شبکه عصبی MLP که در شکل 1 نمایش داده شدهاست با استفاده از کد زیر (MLP) در نرمافزار متلب پیادهسازی میشود.
%MLP
clear; clc;
[TrainX,TrainLabel]=LoadData('train-images.idx3-ubyte','train-labels.idx1-ubyte');
[TestX,TestLabel]=LoadData('t10k-images.idx3-ubyte','t10k-labels.idx1-ubyte');
TrainX=double(reshape(TrainX,28*28,size(TrainX,3))'); %Train Data [60000x784]
TestX=double(reshape(TestX,28*28,size(TestX,3))'); %Test Data [10000x784]
Percentage=20; %Percentage of Train Data for Validation
ValidRowNum=randperm(size(TrainX,1),Percentage*size(TrainX,1)/100);
ValidX=TrainX(ValidRowNum,:);
ValidLabel=TrainLabel(ValidRowNum,:);
%New Train Data (Without Validation Data)
TrainX(ValidRowNum,:)=[]; %Train Data [48000x784]
TrainLabel(ValidRowNum,:)=[]; %Train Label [48000x1]
%Neural Network Parameters
NumOutput=10; %Number of Output (Output Units)
NumFeatures=size(TrainX,2); %Number of Features (Input Units)
NumHidden=50; %Number of Hidden Units
MaxEpoch=100; %Maximum Number of Epochs
Eta=0.001; %Learning Rate
Alpha=0.001; %Momentum
Batch=50; %Split Data to #Batch Parts
%Weights: W1, W2
W1=2*rand(NumHidden,NumFeatures+1)-1;
W2=2*rand(NumOutput,NumHidden+1)-1;
NewLabel=zeros(NumOutput,length(TrainLabel));
for i=1:length(TrainLabel)
val=TrainLabel(i)+1;
NewLabel(val,i)=1;
end
DeltaW1Previous=zeros(size(W1)); %Previous DeltaW1
DeltaW2Previous=zeros(size(W2)); %Previous DeltaW2
Counter=1;
for Epoch=1:MaxEpoch
Epoch %Display Epoch on Command Window
%Split Data to #Batch Parts
Num=floor(length(TrainLabel)/Batch);
TrainLabel=TrainLabel(1:Num*Batch);
TrainX=TrainX(1:Num*Batch,:);
ReshapedData=reshape(1:length(TrainLabel),Batch,[]);
for j=1:Batch
Data=ReshapedData(j,:);
%Feedforward
Var1=[ones(size(TrainX(Data,:),1),1),TrainX(Data,:)]; %Add Bias (First Column)
Var2=W1*Var1';
Var3=1./(1+exp(-Var2));
Var3=[ones(1,size(Var3,2));Var3]; %Add Bias (First Row)
Var4=W2*Var3;
Var5=1./(1+exp(-Var4));
%Gradient (Backpropagation)
Var6=Var5-NewLabel(:,Data);
Var2=[ones(1,size(Var2,2));Var2]; %Add Bias (First Row)
SigVar2=1./(1+exp(-Var2));
dSigVar2=SigVar2.*(1-SigVar2);
Var7=W2'*Var6.*dSigVar2;
Var7=Var7(2:end,:);
Gradient1=Var7*Var1;
Gradient2=Var6*Var3';
DeltaW1=Eta*Gradient1;
DeltaW2=Eta*Gradient2;
W1=W1-(DeltaW1+(Alpha*DeltaW1Previous));
W2=W2-(DeltaW2+(Alpha*DeltaW2Previous));
DeltaW1Previous=DeltaW1;
DeltaW2Previous=DeltaW2;
end
AllW1(:,:,Epoch)=W1; %Save W1 of All Epochs
AllW2(:,:,Epoch)=W2; %Save W2 of All Epochs
%Predict Train Data
Var1=[ones(size(TrainX,1),1),TrainX]; %Add Bias (First Column)
Var2=W1*Var1';
Var3=1./(1+exp(-Var2));
Var3=[ones(1,size(Var3,2));Var3]; %Add Bias (First Row)
Var4=W2*Var3;
[~,Label]=max(Var4);
TrainPred=Label-1; %Map to 0:9
%Predict Validation Data
Var1=[ones(size(ValidX,1),1),ValidX]; %Add Bias (First Column)
Var2=W1*Var1';
Var3=1./(1+exp(-Var2));
Var3=[ones(1,size(Var3,2));Var3]; %Add Bias (First Row)
Var4=W2*Var3;
[~,Label]=max(Var4);
ValidPred= Label-1; %Map to 0:9
%Predict Test Data
Var1=[ones(size(TestX,1),1),TestX]; %Add Bias (First Column)
Var2=W1*Var1';
Var3=1./(1+exp(-Var2));
Var3=[ones(1,size(Var3,2));Var3]; %Add Bias (First Row)
Var4=W2*Var3;
[~,Label]=max(Var4);
TestPred=Label-1; %Map to 0:9
%Accuracy of Train, Validation & Test Data
TrainAccuracy(Counter)=(sum(TrainLabel'==TrainPred)/size(TrainX,1))*100;
ValidAccuracy(Counter)=(sum(ValidLabel'==ValidPred)/size(ValidX,1))*100;
TestAccuracy(Counter)=(sum(TestLabel'==TestPred)/size(TestX,1))*100;
EpochAxis(Counter)=Epoch;
Counter=Counter+1;
end
%Plot Accuracy-Epochs Diagram
plot(EpochAxis,TrainAccuracy,'b',EpochAxis,ValidAccuracy,'r',EpochAxis,TestAccuracy,'k','LineWidth',1.5);
xlabel('Epochs');
ylabel('Accuracy (%)');
legend('Accuracy on Train Data','Accuracy on Validation Data','Accuracy on Test Data');
%Save Data
%dlmwrite('W1.txt',W1);
جدول زیر متغییرها و توابع مورد استفاده در کد MLP را نمایش میدهد که برای پیادهسازی شبکه عصبی MLP استفاده شدهاست.
متغییرها و توابع | توضیح |
TrainX | دادگان آموزش (بدون لیبل) |
TrainLabel | لیبل دادگان آموزش |
TestX | دادگان تست (بدون لیبل) |
TestLabel | لیبل دادگان تست |
LoadData | تابع LoadData برای خواندن فایل دادگان آموزش و تست |
double(X) | تبدیل متغییر X به نوع double |
reshape | تغییر ساختار آرایه با توجه به تنظیمات ورودی |
size | خروجی این دستور ابعاد آرایه ورودی است. |
Percentage | درصد داده ولیدیشن (در اینجا از 20 دادگان آموزش برای ولیدیشن استفاده شدهاست؛ میتوان هر مقدار دیگری برای آن در نظر گرفت.) |
ValidRowNum | این بردار شامل شماره سطرهای دادگان آموزش است که برای ولیدیشن استفاده میشود. این شمارهها به صورت تصادفی تولید شدهاند. |
randperm(n,m) | این تابع یک جایگشت تصادفی از اعداد 1 تا n تولید کرده و m عدد از آن را خارج میکند. |
ValidX | دادگان ولیدیشن (بدون لیبل) |
ValidLabel | لیبل دادگان ولیدیشن |
NumOutput | تعداد خروجی یا تعداد یونیتهای Output |
NumFeatures | تعداد ویژگیها (features) یا تعداد یونیتهای Input |
NumHidden | تعداد یونیتهای Hidden |
MaxEpoch | ماکسیموم Epoch (برنامه تا این مقدار Epoch اجرا و نمودار رسم میشود) |
Eta | نرخ یادگیری η (به انگلیسی: Learning Rate) |
Alpha | مومنتوم α |
Batch | تعداد Batch (قسمت) دادگان آموزش. به عنوان مثال اگر این مقدار 50 باشد، کل دادگان اموزش به 50 قسمت تقسیم میشود تا در هر ایتریشن از یک Batch استفاده شود. |
W1, W2 | ضرایب وزنی (در شکل 1 نمایش داده شدهاند). تعداد سطرهای ماتریس W1 برابر تعداد یونیتهای Hidden و تعداد ستونها یکی بیشتر از تعداد یونیتهای Input است (به دلیل وجود بایاس). همچنین تعداد سطرهای ماتریس W2 برابر با تعداد یونیتهای Output و تعداد ستونها یکی بیشتر از تعداد یونیتهای Hidden است (به دلیل وجود بایاس) |
rand | تولید یک آرایه با مقادیر تصادفی با توزیع یکنواخت استاندارد. |
NewLabel | ماتریسی که لیبلها را با ساختار متفاوتی ذخیره میکند. این ماتریس 10 سطر (به تعداد خروجی ها (ارقام 0 تا 9)) دارد. تعداد ستونها برابر با تعداد دادگان آموزش است و هر ستون لیبل یک داده را مشخص میکند. به عنوان مثال اگر لیبل داده 20 ام 5 باشد، تمام درایه های ستون 20 ام ماتریس NewLabel صفر است به جز درایه سطر 6 ام که 1 خواهد بود. (لیبلها از 0 شروع میشوند، اما درایه ها از 1، به همین دلیل برای مشخص کردن سطرها یک واحد به لیبلها اضافه میشود.) |
zeros | یک آرایه با درایههای 0 تولید میکند. |
length | طول بردار را میدهد (خواه افقی باشد خواه عمودی) |
i | شمارنده حلقه روی دادگان آموزش |
val | سطر متناظر با هر لیبل در ماتریس NewLabel (یک واحد به هر لیبل اضافه میشود) |
DeltaW1Previous | مقدار ΔW1 مرحله قبل |
DeltaW2Previous | مقدار ΔW2 مرحله قبل |
Counter | یک شمارنده که در هر Epoch یکی اضافه میشود. (برای ذخیره صحت دادگان در بردار) |
Epoch | شمارنده حلقه که مشخص کننده Epoch است. |
Num | تعداد دادگان آموزش در هر Batch. |
floor | قسمت اعشار اعداد را حذف میکند. |
ReshapedData | این ماتریس شامل شماره دادگان اموزش به تفکیک هر Batch است. |
j | شمارنده حلقه روی Batchها |
ones | تولید آرایه با درایههای 1 |
Var1, Var2, … Var7 | متغییرهای واسطه برای محاسبه گرادیانها و ضرایب وزنی |
SigVar2 | تابع سیگموئید (از نوع لجستیک) با ورودی Var2 |
dSigVar2 | مشتق تابع سیگموئید (از نوع لجستیک) با ورودی Var2 |
Gradient1, Gradient2 | گرادیان ضرایب وزنی W1 و W2 |
DeltaW1, DeltaW2 | ΔW1 ,ΔW2 |
AllW1, AllW2 | این دو ماتریس مقادیر W1 و W2 را در هر Epoch ذخیره میکند تا در صورت نیاز بتوان به ضرایب وزنی هر Epoch دست یافت. |
max | مقدار و مکان درایه ماکسیموم را مشخص میکند. مکان درایه ماکسیموم متناظر با لیبل داده است. |
Label | این بردار شامل لیبل دادگان است. (از 1 تا 10) |
TrainPred | لیبل دادگان آموزش (از 0 تا 9) |
ValidPred | لیبل دادگان ولیدیشن (از 0 تا 9) |
TestPred | لیبل دادگان تست (از 0 تا 9) |
sum(x==y) | این دستور مشخص میکند چه تعداد از درایه های x با درایه های متناظر از y برابر است. |
TrainAccuracy | برداری که شامل صحت دادگان آموزش در هر Epoch است. از این بردار برای رسم منحنی صحت برحسب Epoch استفاده میشود. |
ValidAccuracy | برداری که شامل صحت دادگان ولیدیشن در هر Epoch است. از این بردار برای رسم منحنی صحت برحسب Epoch استفاده میشود. |
TestAccuracy | برداری که شامل صحت دادگان تست در هر Epoch است. از این بردار برای رسم منحنی صحت برحسب Epoch استفاده میشود. |
EpochAxis | محور Epoch برای رسم منحنی صحت برحسب Epoch |
plot | رسم نمودار |
xlabel | نام محور x |
ylabel | نام محور y |
legend | راهنمای نمودار |
در کد MLP، ابتدا دادگان آموزش و تست به همراه لیبلها با استفاده از تابع LoadData خوانده و لود میشوند. در اینجا دادگان آموزش و تست سه بعدی با ابعاد [28x28x60000] هستند. برای سادگی در کار، ساختار دادگان آموزش و تست با دستور reshape به حالت دو بعدی تبدیل میشود. هر سطر متناظر با یک داده خواهد بود و تمام پیکسلها برای هر تصویر (28x28=784) در یک سطر قرار خواهند گرفت. بنابراین دادگان آموزش جدید دارای ابعاد [60000x784] خواهد بود.
در این مقاله از 20% دادگان آموزش به عنوان دادگان ولیدیشن (Validation) استفاده خواهد شد. بنابراین در کد MLP دادگان ولیدیشن به همراه لیبل به صورت تصادفی از دادگان آموزش جدا میشود. بدین ترتیب دادگان آموزش به 48000 عدد کاهش مییابد.
حال پارامترهای شبکه عصبی MLP تعیین میشود. تعداد یونیتهای Output برابر 10 (به تعداد ارقام 0 تا 9) است. تعداد ویژگیها (Features) برابر با تعداد یونیتهای Input است. این مقدار برابر 28x28=784 است. تعداد یونیتهای Hidden میتواند مقادیر متفاوتی داشته باشد که در این گزارش نمودار صحت برحسب Epoch به ازای مقادیر مختلف تعداد یونیت Hidden رسم میشود. حداکثر Epoch با متغییر MaxEpoch مشخص میشود تا الگوریتم پس از آن متوقف شود. نرخ یادگیری η (به انگلیسی: Learning Rate) با متغییر Eta و مومنتوم α (به انگلیسی: Momentum) با متغییر Alpha مشخص شدهاست. در این الگوریتم از روش Mini-Batch برای گرادیان نزولی استفاده شده است و متغییر Batch مشخص کننده تعداد قسمتهای دادگان آموزشی است. به عنوان مثال اگر متغییر Batch برابر 50 باشد، دادگان آموزشی به 50 قسمت تقسیم میشوند.
ضرایب وزنی W1 و W2 به صورت تصادفی بین -1 تا +1 مقداردهی اولیه میشوند. تعداد سطرهای ماتریس W1 به تعداد یونیتهای Hidden و تعداد ستونهای آن یکی بیشتر از یونیتهای Input است (به دلیل وجود بایاس). همچنین تعداد سطرهای ماتریس W2 به تعداد یونیتهای Output و تعداد ستونها یکی بیشتر از تعداد یونیتهای Hidden است (به دلیل وجود بایاس).
پس از تعریف پارامترهای شبکه عصبی MLP، ماتریس NewLabel برای مشخص کردن لیبل دادگان ایجاد میشود. تعداد سطرهای ماتریس NewLabel برابر 10 (به تعداد لیبلها؛ بعنی ارقام 0 تا 9) و تعداد ستونها برابر تعداد دادگان آموزش (در اینجا 48000) است. هر ستون معرف لیبل یک داده است. به عنوان مثال اگر داده 30ام دارای لیبل 3 باشد، سطر 4ام ستون 30ام ماتریس NewLabel مقدار 1 دارد و بقیه درایهها صفر است. در این مثال لیبل 3 متناظر با سطر 4 بود، زیرا لیبلها از 0 شروع میشوند در حالیکه شماره سطرها از 1 شروع میشود.
پس از تعریف متغییرهای لازم، یک حلقه خارجی برای Epoch درنظر گرفته میشود که از 1 تا مقدار تعیین شده MaxEpoch اجرا میشود. در هر Epoch الگوریتم یک بار به صورت کامل از روی دادگان آموزش عبور میکند. داخل حلقه Epoch، یک حلقه روی Batchها وجود دارد. در حلقه داخلی، ضرایب وزنی با استفاده از روش Backpropagation آپدیت میشوند. لازم به ذکر است در این شبکه از تابع لجستیک که یکی از توابع سیگوموئید است، استفاده شدهاست. در هر Epoch، لیبل دادگان آموزش، ولیدیشن و تست پیشبینی شده و با توجه به لیبلهای اصلی، میزان صحت پیشبینی دادگان اموزش، ولیدیشن و تست محاسبه میشود. در نهایت منحنی صحت دادگان آموزش، ولیدیشن و تست برحست Epoch ترسیم میشود. در انتهای کد MLP یک خط کامنت شده نیز برای ذخیره متغییرها (مانند ضرایب وزنی W1 و W2 و یا مقادیر صحت در Epochهای مختلف) قرار داده شدهاست تا درصورت نیاز بتوان به مقادیر متغییرها دسترسی داشت.
بررسی تعداد مختلف یونیت Hidden
کد MLP برای نرخ یادگیری η=0.001 و مومنتوم α=0.001 به ازای تعداد مختلف یونیت Hidden اجرا میشود و در هر اجرا Epoch مناسب انتخاب شده و صحت پیشبینی دادگان گزارش میشود. شکلهای 2، 3، 4 و 5 منحنی صحت پیشبینی دادگان آموزش، ولیدیشن و تست را برحسب Epoch برای تعداد مختلف یونیت Hidden نمایش میدهد. تعداد یونیتهای Hidden در شکلهای 2، 3، 4 و 5 به ترتیب برابر 10، 50، 100 و 200 است. در تمام اجراها مقدار متغییر Batch برابر 50 است.
شکل 2 - صحت پیشبینی دادگان برحسب Epoch برای 10 یونیت Hidden
با توجه به شکل 2، حدودا در Epoch=30 تغییرات صحت پیشبینی دادگان ولیدیشن بسیار کم میشود. بنابراین در حالتی که 10 یونیت Hidden وجود دارد Epoch مناسب برابر 30 انتخاب میشود. در Epoch=30 صحت پیشبینی برای دادگان آموزش 80%، برای دادگان ولیدیشن 80.17% و برای دادگان تست 80.85% است. همچنین در Epoch=200 صحت پیشبینی برای دادگان آموزش 85.98%، برای دادگان ولیدیشن 85.44% و برای دادگان تست 85.71% است که تفاوت زیادی با Epoch=30 ندارد.
شکل 3 - صحت پیشبینی دادگان برحسب Epoch برای 50 یونیت Hidden
با توجه به شکل 3، حدودا در Epoch=40 تغییرات صحت پیشبینی دادگان ولیدیشن بسیار کم میشود. بنابراین در حالتی که 50 یونیت Hidden وجود دارد Epoch مناسب برابر 40 انتخاب میشود. در Epoch=40 صحت پیشبینی برای دادگان آموزش 88.74%، برای دادگان ولیدیشن 89.03% و برای دادگان تست 88.80% است. همچنین در Epoch=200 صحت پیشبینی برای دادگان آموزش 92.67%، برای دادگان ولیدیشن 92.45% و برای دادگان تست 92.60% است که تفاوت زیادی با Epoch=40 ندارد.
شکل 4 - صحت پیشبینی دادگان برحسب Epoch برای 50 یونیت Hidden
با توجه به شکل 4، حدودا در Epoch=40 تغییرات صحت پیشبینی دادگان ولیدیشن بسیار کم میشود. بنابراین در حالتی که 100 یونیت Hidden وجود دارد Epoch مناسب برابر 40 انتخاب میشود. در Epoch=40 صحت پیشبینی برای دادگان آموزش 91.70%، برای دادگان ولیدیشن 91.38% و برای دادگان تست 91.30% است. همچنین در Epoch=200 صحت پیشبینی برای دادگان آموزش 94.63%، برای دادگان ولیدیشن 93.92% و برای دادگان تست 94.26% است که تفاوت زیادی با Epoch=40 ندارد.
شکل 5 - صحت پیشبینی دادگان برحسب Epoch برای 50 یونیت Hidden
با توجه به شکل 5، حدودا در Epoch=40 تغییرات صحت پیشبینی دادگان ولیدیشن بسیار کم میشود. بنابراین در حالتی که 200 یونیت Hidden وجود دارد Epoch مناسب برابر 40 انتخاب میشود. در Epoch=40 صحت پیشبینی برای دادگان آموزش 92.91%، برای دادگان ولیدیشن 92.67% و برای دادگان تست 92.63% است. همچنین در Epoch=200 صحت پیشبینی برای دادگان آموزش 95.79%، برای دادگان ولیدیشن 95.12% و برای دادگان تست 95.09% است که تفاوت زیادی با Epoch=40 ندارد.
افزایش تعداد یونیت Hidden موجب افزایش صحت پیشبینی دادگان شدهاست. از طرفی افزایش تعداد یونیت Hidden باعث افزایش حجم شبکه و زمان اجرای برنامه میگردد. تعداد مناسب یونیت Hidden برای قسمتهای بعدی برابر 50 در نظر گرفته میشود؛ زیرا صحت پیشبینی در 100 و 200 یونیت تفاوت زیادی با 50 یونیت ندارد.
بررسی نرخ یادگیری (η)
کد MLP برای 50 یونیت Hidden و مومنتوم α=0.001 به ازای مقادیر مختلف نرخ یادگیری (η) اجرا میشود. شکلهای 6، 7، 8 و 9 منحنی صحت پیشبینی دادگان آموزش، ولیدیشن و تست را برحسب Epoch به ازای مقادیر مختلف نرخ یادگیری (η) نمایش میدهد. در شکلهای 6، 7، 8 و 9 نرخ یادگیری به ترتیب برابر 0.00001، 0.0001، 0.001 و 0.005 است. در تمام اجراها مقدار متغییر Batch برابر 50 در نظر گرفته شدهاست.
شکل 6 - منحنی صحت پیشبینی دادگان MNIST برحسب Epoch برای نرخ یادگیری η=0.00001
شکل 7 - منحنی صحت پیشبینی دادگان MNIST برحسب Epoch برای نرخ یادگیری η=0.0001
شکل 8 - منحنی صحت پیشبینی دادگان MNIST برحسب Epoch برای نرخ یادگیری η=0.001
شکل 9 - منحنی صحت پیشبینی دادگان MNIST برحسب Epoch برای نرخ یادگیری η=0.005
صحت پیشبینی دادگان آموزش، ولیدیشن و تست در Epoch=40 به ازای مقادیر مختلف نرخ یادگیری (η) در جدول زیر آمده است.
نرخ یادگیری (η) | صحت دادگان آموزش | صحت دادگان ولیدیشن | صحت دادگان تست |
η=0.00001 | 55.46% | 55.81% | 55.66% |
η=0.0001 | 84.82% | 85.16% | 84.82% |
η=0.001 | 89.48% | 89.23% | 89.22% |
η=0.005 | 55.13% | 54.50% | 55.76% |
درصورتی که نرخ یادگیری (η) کوچک باشد، سرعت همگرایی کند است و برای رسیدن به صحت مطلوب باید تعداد Epoch را افزایش داد. از طرفی درصورتی که نرخ یادگیری (η) بزرگ باشد، کلا نمیتوان به نقطه بهینه همگرا شد. با توجه به نتایج بدست آمده، η=0.001 میتواند نرخ یادگیری مناسبی باشد که در قسمت قبل نیز استفاده شد.
به سادگی میتوان کدهای بالا را متناسب با نیازهای خود تغییر داده و نتایج مورد نظر را استخراج کرد.
دیدگاه بگذارید