基于降噪自編碼器-多層感知機(DAE-MLP)的手寫數字分類預測MATLAB實戰

    今天給大家分享基于DAF-MLP的手寫數字分類預測MATLAB實戰 ,主要從算法原理和代碼實戰展開。


一、算法原理

1.1 降噪自編碼器(Denoising Auto-Encoders, DAE

    在介紹降噪自編碼器的原理之前,需要介紹一下自編碼器的原理,這樣才能方便我們理解降噪自編碼器的原理。如圖1所示為自編碼器的網絡結構,它包含有編碼階段和解碼階段。主要應用于數據去噪和數據降維。


基于降噪自編碼器-多層感知機(DAE-MLP)的手寫數字分類預測MATLAB實戰的圖1

圖1 自編碼器的網絡結構

它的編碼和解碼過程可表達為

基于降噪自編碼器-多層感知機(DAE-MLP)的手寫數字分類預測MATLAB實戰的圖2

其中,W1、b1為編碼的權重和偏置,W2、b2為編碼的權重和偏置,

自編碼器的目的是使輸出與輸入盡量相同,所以采用的損失函數可表達為:

基于降噪自編碼器-多層感知機(DAE-MLP)的手寫數字分類預測MATLAB實戰的圖3當損失函數J的值越小,那么經自編碼器重構的數據與原始數據就盡可能的相同。但在實際中,我們更關注的是自編碼器的隱層表達,而不是實際輸出。自編碼器真正關心的是隱藏層的特征表達,一個好的表達能夠捕獲輸入信號的穩定結構,以該目的為出發出現了降噪自動編碼器。

    降噪自動編碼器的網絡結構如圖2所示。降噪自動編碼器,首先對干凈的輸入信號加入噪聲產生一個受損的信號。然后將受損信號送入傳統的自動編碼器中,使其重建回原來的無損信號。降噪自編碼器的優點是:它通過人為的增加噪聲使模型獲得魯棒性的特征表達。

基于降噪自編碼器-多層感知機(DAE-MLP)的手寫數字分類預測MATLAB實戰的圖4

圖2 降噪自編碼器的網絡結構

  1. 1.2 多層感知機(Multilayer Perceptron,MLP

  2.       多層感知機是由單層感知機推廣而來,最主要的特點是有多個神經元層。一般將MLP的第一層稱為輸入層,中間的層為隱藏層,最后一層為輸出層。如下圖3所示。MLP并沒有規定隱藏層的數量,因此可以根據實際處理需求選擇合適的隱藏層層數,且對于隱藏層和輸出層中每層神經元的個數也沒有限制。 多層感知機采用反向傳播BP算法訓練得到模型的權重和偏置。關于MLP的公式推導這里不做詳細的描述,大家可參考下面的文章:手把手教學 - MLP算法實現 - 知乎 (zhihu.com)

基于降噪自編碼器-多層感知機(DAE-MLP)的手寫數字分類預測MATLAB實戰的圖5

圖3 多層感知機的網絡結構

二、代碼實戰

%%以手寫數字分類預測為例clcclear
% load MNISTload 'mnist_14x14.mat';
% shuffle the training dataX_labels = X_labels + 1;X_test_labels = X_test_labels + 1;
perm_idx = randperm (size(X,1));
n_all = size(X, 1);n_train = ceil(n_all * 3 / 4);n_valid = floor(n_all /4);
X_valid = X(perm_idx(n_train+1:end), :);X_valid_labels = X_labels(perm_idx(n_train+1:end));X = X(perm_idx(1:n_train), :);X_labels = X_labels(perm_idx(1:n_train));
layers = [size(X,2), 500, 500, 10];n_layers = length(layers);blayers = [1, 1, 1, 1];
use_tanh = 0;do_pretrain = 1;
if do_pretrain    Ds = cell(n_layers - 2, 1);    H = X;    H_valid = X_valid;
   for l = 1:n_layers-2        % construct DAE and use default configurations        D = default_dae (layers(l), layers(l+1));
       D.data.binary = blayers(l);        D.hidden.binary = blayers(l+1);
       if use_tanh            if l > 1                D.visible.use_tanh = 1;            end            D.hidden.use_tanh = 1;        else            if D.data.binary                mH = mean(H, 1)';                D.vbias = min(max(log(mH./(1 - mH)), -4), 4);            else                D.vbias = mean(H, 1)';            end        end
       D.learning.lrate = 1e-1;        D.learning.lrate0 = 5000;        D.learning.minibatch_sz = 128;
       D.noise.drop = 0.2;        D.noise.level = 0;
       %D.adagrad.use = 1;        %D.adagrad.epsilon = 1e-8;        D.adadelta.use = 1;        D.adadelta.epsilon = 1e-8;        D.adadelta.momentum = 0.99;
       D.valid_min_epochs = 10;
       if blayers(l+1)            D.cae.cost = 0.01;            %D.sparsity.target = 0.1;            %D.sparsity.cost = 0.01;        end
       D.iteration.n_epochs = 500;
       % save the intermediate data after every epoch        D.hook.per_epoch = {@save_intermediate, {sprintf('dae_mnist_%d.mat', l)}};
       % print learining process        D.verbose = 0;        % display the progress        D.debug.do_display = 0;
       % train RBM        fprintf(1, 'Training DAE (%d)\n', l);        tic;        D = dae (D, H, H_valid, 0.1);        fprintf(1, 'Training is done after %f seconds\n', toc);
       H = dae_get_hidden(H, D);        H_valid = dae_get_hidden(H_valid, D);
       Ds{l} = D;    endend
M = default_mlp (layers);
M.output.binary = blayers(end);M.hidden.use_tanh = use_tanh;
M.valid_min_epochs = 10;M.dropout.use = 1;
M.hook.per_epoch = {@save_intermediate, {'mlp_mnist.mat'}};
M.learning.lrate = 1e-3;M.learning.lrate0 = 5000;M.learning.minibatch_sz = 128;
M.adadelta.use = 1;M.adadelta.epsilon = 1e-8;M.adadelta.momentum = 0.99;
M.noise.drop = 0;M.noise.level = 0;
M.iteration.n_epochs = 100;
if do_pretrain    for l = 1:n_layers-2        M.biases{l+1} = Ds{l}.hbias;        M.W{l} = Ds{l}.W;    endend
fprintf(1, 'Training MLP\n');tic;M = mlp (M, X, X_labels, X_valid, X_valid_labels, 0.1);fprintf(1, 'Training is done after %f seconds\n', toc);
[pred] = mlp_classify (M, X_test);n_correct = sum(X_test_labels == pred);
fprintf(2, 'Correctly classified test samples: %d/%d\n', n_correct, size(X_test, 1));

實現結果:

基于降噪自編碼器-多層感知機(DAE-MLP)的手寫數字分類預測MATLAB實戰的圖6

基于降噪自編碼器-多層感知機(DAE-MLP)的手寫數字分類預測MATLAB實戰的圖7

    需要調整相關參數才能獲得較好的效果,由于運行時間較長,這里不再進行調參后的效果展示,此代碼是根據算法原理來寫的可供入門DAE的同學學習


文章來源:matlab學習之家

登錄后免費查看全文
立即登錄
App下載
技術鄰APP
工程師必備
  • 項目客服
  • 培訓客服
  • 平臺客服

TOP

1