پیاده‌سازی شبکه عصبی MLP برای دیتاست MNIST در نرم‌افزار متلب (MATLAB)

متلب تمام مطالب

پیاده‌سازی شبکه عصبی MLP برای دیتاست MNIST در نرم‌افزار متلب (MATLAB)

پرسپترون چند لایه که به اختصار MLP: Multilayer Perceptron نامیده می‌شود، زیرمجموعه‌ای از شبکه‌های عصبی مصنوعی پیشخور (Feedforward) است که حداقل از سه لایه تشکیل شده‌است. این سه لایه عبارتند…

نویسنده : لرنیکس
بازدیدها : ۴۰۴

پرسپترون چند لایه که به اختصار 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 را نمایش می‌دهد.

Fig 1 - MLP Neural Network For MNIST Dataset

شکل 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 است.

 

Fig 2 - 10 Hidden Units For MLP Neural Network [MNIST Dataset]

شکل 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 ندارد.

 

Fig 3 - 50 Hidden Units For MLP Neural Network [MNIST Dataset]

شکل 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 ندارد.

 

Fig 4 - 100 Hidden Units For MLP Neural Network [MNIST Dataset]

شکل 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 ندارد.

 

Fig 5 - 200 Hidden Units For MLP Neural Network [MNIST Dataset]

شکل 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 در نظر گرفته شده‌است.

 

Fig 6 - Learning Rate 0.00001 For MLP Neural Network [MNIST Dataset]

شکل 6 - منحنی صحت پیش‌بینی دادگان MNIST برحسب Epoch برای نرخ یادگیری η=0.00001

 

Fig 7 - Learning Rate 0.0001 For MLP Neural Network [MNIST Dataset]

شکل 7 - منحنی صحت پیش‌بینی دادگان MNIST برحسب Epoch برای نرخ یادگیری η=0.0001

 

Fig 8 - Learning Rate 0.001 For MLP Neural Network [MNIST Dataset]

شکل 8 - منحنی صحت پیش‌بینی دادگان MNIST برحسب Epoch برای نرخ یادگیری η=0.001

 

Fig 9 - Learning Rate 0.005 For MLP Neural Network [MNIST Dataset]

شکل 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 می‌تواند نرخ یادگیری مناسبی باشد که در قسمت قبل نیز استفاده شد.

به سادگی می‌توان کدهای بالا را متناسب با نیازهای خود تغییر داده و نتایج مورد نظر را استخراج کرد.

 

امتیاز :

دیدگاه بگذارید

avatar