MLP 多層感知機的原理及Matlab實現

2021-08-03 07:37:01 字數 4453 閱讀 6578

關於這個看過很多資料,很多資料好像還將感知機和人體大腦感知系統聯絡起來什麼的,深深的乙個白眼。。。根本沒必要說的多麼高大上,學過模電的同學就很好理解,其實每個感知器都相當於乙個二極體,將很多很多二極體組合在一起就可以完成乙個邏輯電路,實現我們需要的功能。不同的只是這個「二極體「的引數是機器自己更新學習到的而已。

我的**使用[隨機梯度下降],耗時比較長,準確率只能達到92%左右,使用batch_gradient descend應該會進一步改善,之後有時間將會進一步修改完善**。

學習速率:0.01

loss下線:0.38

這些引數均可以修改。

%% % 處理資料每行讀取資料,如果是o或者d,存入陣列

% src=fopen('/users/sdd/desktop/letter-recognition.data');

uiimport('/users/sdd/desktop/letter-recognition.data');

all_data_src=;

all_label=;

fori=1:20000

if letterrecognition=='o'

all_data_src=[all_data_src;[letterrecognition(i,2:end)]];

all_label=[all_label;1];

endif letterrecognition=='d'

all_data_src=[all_data_src;[letterrecognition(i,2:end)]];

all_label=[all_label;0];

endendall_data_src=cell2mat(all_data_src);

%% % 將所有陣列進行pca降維

[m,n]=size(all_data_src);

data_number=m;

feature_src_number=n;

[coeff,score,latent]=princomp(all_data_src);

fori=1:feature_src_number

if sum(latent(1:i))/sum(latent)>=0.95

all_data=all_data_src(:,1:i);

break;

endend[m1,n1]=size(all_data);

data_number=m1;

feature_number=n1;

% % % 將所有資料分成測試集和訓練集

train_number=floor(m1*0.7);

train_label=all_label(1:train_number);

test_label=all_label(train_number+1:end);

train_data=all_data(1:train_number,:);

test_data=all_data(train_number+1:end,:);

% % % 用mlp_1hidden進行訓練,得到訓練準確率和測試準確率

% % % [train_accuracy,test_accuracy] = mlp_1hidden(train_data,train_label,test_data,test_label);

[m1,n]=size(train_data);

[m2,n2]=size(test_data);

feature_number=n;

train_data_number=m1;

test_data_number=m2;

% 中間層個數的初始化

hidden_layer_number=3;

% 權值的初始化,令其為很小的高斯分布隨機數

w1=0.1*randn(feature_number,hidden_layer_number);

w2=0.1*randn(hidden_layer_number,1);

% bias的初始化

b1=ones(1,hidden_layer_number);

b2=1;

while

1% 得到每個train data的**數值

predict_list=zeros(train_data_number,1);

fori=1:train_data_number

y1_original=train_data(i,: )*w1;

y1=y1_original+b1;

y1=sigmoid(y1);

y2_original=y1*w2;

y2=y2_original+b2;

y2=sigmoid(y2); %%%y2為**值

predict_list(i,:)=y2;

end% 計算loss值

loss_sum=0;

fori=1:train_data_number

loss_for_single=0.5*(1/train_data_number)*(train_label(i,:)-predict_list(i,:))^2;

loss_sum=loss_sum+loss_for_single;

end% 當loss小於0.001時,得到最優結果跳出,可以更改數值得到不同精度

loss_sum

if loss_sum<0.038

break;

end% 使用梯度下降更新權值

% 設定每層的學習速率

learning_rate_w1=0.01;

learning_rate_w2=0.01;

% 任意選取乙個點,計算其各個量值以便後續的隨機梯度下降

choosen_point=randperm(train_data_number,1);

choosen_data=train_data(choosen_point,:);

choosen_label=train_label(choosen_point);

y22=sigmoid(choosen_data*w1+b1);

y=sigmoid(y22*w2+b2);

% 對中間隱藏層進行隨機梯度下降

% % loss_gradient為w1,w2的關於loss function的梯度

loss_gradient_w2=zeros(hidden_layer_number,1);

loss_gradient_b2=(choosen_label-y)*y*(1-y);

fori=1:hidden_layer_number

loss_gradient_w2(i,:)=(choosen_label-y)*y*(1-y)*y22(:,i);

end% 完成w2的梯度更新

w2=w2+learning_rate_w2*loss_gradient_w2;

b2=b2+learning_rate_w2*loss_gradient_b2;

% 對輸入層進行隨機梯度下降

loss_gradient_w1=zeros(feature_number,hidden_layer_number);

fori=1:feature_number

forj=1:hidden_layer_number

loss_gradient_w1(i,j)=(choosen_label-y)*y*(1-y)*w2(j,:)*(1-y22(:,j))*y22(:,j)*choosen_data(:,i);%%%%%%%%

endend

loss_gradient_b1=zeros(1,hidden_layer_number);

fori=1:hidden_layer_number

loss_gradient_b1(:,j)=(choosen_label-y)*y*(1-y)*w2(j,:)*(1-y22(:,j))*y22(:,j);

end% % 完成w1的梯度更新

w1=w1+learning_rate_w1*loss_gradient_w1;

b1=b1+learning_rate_w1*loss_gradient_b1;

end% 用最終的w1,w2得到的predict_list計算train_accuracy

%%寫出**label

predict_label_list=zeros(train_data_number,1);

fori=1:train_data_number

if predict_list(i,:)>0.5

predict_label_list(i,:)=1;

else

predict_label_list(i,:)=0;

endendjudge_list=train_label-predict_label_list;

accurate_count=length(find(judge_list==0))

train_accuracy=accurate_count/train_data_number

多層感知機(MLP)原理簡介

多層感知機 mlp,multilayer perceptron 也叫人工神經網路 ann,artificial neural network 除了輸入輸出層,它中間可以有多個隱層,最簡單的mlp只含乙個隱層,即三層的結構,如下圖 輸入層沒什麼好說,你輸入什麼就是什麼,比如輸入是乙個n維向量,就有n個...

多層感知機MLP

關於感知機 1.什麼是感知機 perceptron 感知機是最簡單的神經網路,具備神經網路的必備要素。感知機也稱為感知器,是一種雙層神經網路,即只有輸入層和輸出層而沒有隱層的神經網路。感知機是一種二類分類的線性分類器,其輸入為例項的特徵向量,輸出為例項的類別,感知機屬於判別模型,旨在求出將訓練資料進...

MLP 多層感知機網路

反向傳播神經網路是對非線性可微分函式進行權值訓練的多層網路,是前向神經網路的一種。比如,乙個三層bpn結構如下 由輸入層 隱含層和輸出層三層組成。其中每一層的單元與之相鄰層的所有單元連線,同一層的單元之間沒有連線。當一對學習樣本提供給網路後,神經元的啟用值從輸入層經各中間層向輸出層傳播,在輸出層的各...