SDAE訓練流程和代碼實現(Matlab)——咬文嚼字系列

    SDAE(stacked denoised autoencoder ,堆棧去噪自編碼器)是vincent大神提出的無監督的神經網絡模型,論文:Stacked Denoising Autoencoders: Learning Useful Representations ina Deep Network with a Local Denoising Criterion,原文作者從不同角度解釋了模型架構設計理念,非常值得一讀。

    關於原理和架構網上資源很多,論文也很清楚。本文重點在SDAE訓練流程和代碼實現,歡迎大家批評指正。本文SDAE針對圖像進行訓練,模型的輸入是圖像每個像素位置5*5的鄰域塊共25個元素。


    SDAE網絡訓練的總流程如圖1所示,後面逐一對三個步驟進行詳細介紹

圖1: SDAE網絡訓練總流程圖

一、數據預處理

1,函數:uniform_sampling.m

patchsize =5; % window size;

[patches_1,patches_2]= uniform_sampling(im1,im2,patchsize);

上面函數中patchsize是採樣窗大小,可自行設置這裏設置爲5;輸入的im1和im2分別爲時相1圖像和時相2圖像,假設輸入的都是Bern圖像,im1和im2大小分別是301*301,對每個像素採樣選擇以該像素爲中心的5*5鄰域像素值,則每個像素對應25維向量,則im1和im2變成了301*301*25的三維向量,再將前兩維轉變爲1維,則im1和im2的大小都變成了90601*25. 令patches_1=im1,大小爲90601*25,令patches_2=im2,大小爲90601*25

數據預處理的流程如下:

Im1數據預處理如圖2所示,Im2和im1處理方法相同。

圖2 數據預處理

二、SDAE網絡訓練

 pre-training

1,網絡結構初始化

函數saesetup.m ;nnsetup.m;

SDAE輸入的是patches_1和patches_2,是25維數據,中間隱層設置爲100維,輸出是20維,所以網絡結構是25——>100——>20,pre-training的時候是每次只訓練一層,每層都作爲一個去噪自編碼器訓練,然後訓練完了一層再訓練下一層;回憶下自編碼器的流程,希望輸入X和輸出Z是一致的,然後通過最小化輸入和輸出的誤差L(X,Z)來求權重W,所以這裏需初始化兩個網絡。

第一層的網絡結構是25——>100——>25,初始化的權重分別記爲sae.ae{1}W{1}:100*26 ,sae.ae{1}W{2}:25*101; 其中ae{1}是指第一層網絡,W{1}是從25映射到100需要的權重,W{2}是從100映射到25需要的權重。

第二層的網絡結構是100——>20——>100,初始化的權重分別記爲sae.ae{2}W{1}:20*101,sae.ae{2}W{1}:100*21; 其中ae{2}是指第一層網絡,W{1}是從100映射到20需要的權重, W{2}是從20映射到100需要的權重.

除了權重W,還有權重變化量vW需要初始化,vW用來梯度下降法時更新W,還有其他一些參數需要初始化activation_function,learningRate等,等下面用到再做具體介紹。

2,訓練網絡參數

函數:saetrain.m ;nntrain.m

1, 循環for i = 1 :numel(sae.ae):

這裏循環兩次,第一次訓練第一層的網絡參數;第二次訓練第二層的網絡參數.

2, 每次循環進入nntrain函數

train_x=train_y,train_x是patches_1和patches_2按行連接後的圖像,大小是181200*25。

for i = 1 :numepochs循環的次數是自己設置的,這裏numepochs =3,在main函數中設置,意思是每層網絡均訓練三次。

     for i = 1 : numbatches,(numbatches=1812),batch_x是從train_x中隨機取100行,batch_x大小則是100*25,(這裏循環1812次是因爲每次訓練都是任取100行數據,所以需要循環1812次,才能將所有輸入訓練完,這樣做的原因是:比一次全部輸入181200行元素能夠大大降低權重W的參數數量,降低內存消耗,加快執行時間。)對batch_x添加噪聲(標誌位是nn.inputZeroMaskedFraction ~= 0)這裏batch_x添加的噪聲方法是隨機的將一部分元素置0,其餘不變;batch_y是未加噪的batch_x。

每次訓練同時訓練100個像素訓練的流程是:nnff——>nnbp——>nnapplygrads,訓練完成後得到新權重W,然後再用新權重W訓練下100個像素,直到所有像素訓練完得到最終的權重W。

nntrain函數流程如下:

圖3 nntrain函數流程

圖3中的流程進行一遍,完成一次網絡的訓練。訓練第一層網絡需要循環三次圖3流程,訓練第二層網絡和fine-tuning均需要循環三次圖3流程。

訓練第一層網絡:

2.1 nnff函數:執行網絡前饋

     nnff(nn, x, y),nn是網絡結構,x是batch_x(100*25,加了噪聲),y是batch_y(100*25,未加噪聲的原始輸入)。

nnff是網絡前饋,(第一次使用的權重W是網絡結構初始化的權重W,後面使用的權重W是前一次網絡訓練得到的權重W).

 


圖4 第一層網絡前饋

第一層網絡訓練的前饋如圖5所示,對batch_x加一列全爲1的bias記爲nn.a{1},nn.a{1}乘以權重nn.W{1},再取sigmoid函數,加一列全1的bias記爲nn.a{2}; nn.a{2}乘以權重nn.W{2},再取sigmoid函數,加一列全1的bias記爲nn.a{3},即輸出Z.

nn.e =batch_y- Z; nn.e是誤差,誤差是原始未加噪輸入batch_y和訓練後的輸出Z的差,

誤差函數:

目標函數是min 來更新權重,最優化方法是使用BP算法和梯度下降法來得到目標函數的最優解。

2.2 nnbp函數:使用BP算法反求權重變化量dW

中間變量d:

d{3} = - nn.e.* (nn.a{3} .* (1 - nn.a{3}));

d{2} = d{3} *nn.W{2} .* nn.a{2} .* (1 - nn.a{2})

根據中間變量d來更新權值變化量dW的公式:

nn.dW{1} = (d{2}(:,2:end)'* nn.a{1}) / size(d{2}, 1);  

nn.dW{2} = (d{3}'* nn.a{2}) / size(d{3}, 1);

2.3  nnapplygrads函數:通過梯度下降法來更新權重W

    dW = nn.learningRate * dW{i}; 其中learningRate學習率自己設置1

nn.vW{i} =nn.momentum*nn.vW{i} + dW; 其中momentum自己設置爲0.5,nn.vW初始化全0,結構和nn.W一樣

dW = nn.vW{i};

nn.W{i} =nn.W{i} - dW;

其中i取值爲1和2,先更新W{1}在更新W{2}

到這裏網絡完成一次訓練。

 

 

訓練第二層網絡:

2.1 nnff函數

圖5 第二層網絡前饋

圖4中的sae.ae{1}W{1}是第一層網絡訓練好後得到的權重,train_x乘以權重sae.ae{1}W{1},得到第二層網絡的原始輸入,隨機取100行得到batch_y,加噪聲得到batch_x,對batch_x加一列全爲1的bias記爲nn.a{1},nn.a{1}乘以權重nn.W{1},再取sigmoid函數,加一列全1的bias記爲nn.a{2}; nn.a{2}乘以權重nn.W{2},再取sigmoid函數,加一列全1的bias記爲nn.a{3},即輸出Z.

nn.e =batch_y- Z; nn.e是誤差,誤差是原始未加噪輸入batch_y和訓練後的輸出Z的差,

誤差函數:

2.2 nnbp函數

步驟同上

2.3 nnapplygrads函數

步驟同上

到這裏網絡完成一次訓練。

3,saetrain.m函數執行完成後,完成pre-training的訓練,新的權重W分別記爲sae.ae{1}W{1},sae.ae{1}W{2},sae.ae{2}W{1} ,sae.ae{2}W{2},

Fine-tuning

1,網絡結構初始化

函數saesetup.m ;nnsetup.m;

Fine-tuning階段是針對整個網絡進行的微調,整個網絡的結構爲:

25——>100——>20——>100——>25,初始權重採用pre-training訓練好的四個權重,25——>100的映射選擇權重sae.ae{1}W{1},100——>20的映射選擇權重sae.ae{2}W{1},20——>100的映射選擇權重sae.ae{2}W{2},100——>25的映射選擇權重sae.ae{1}W{2}。

2,訓練網絡參數

函數:saetrain.m ;nntrain.m

具體流程使用的函數和pre-training相同。

2.1 nnff函數

圖6 Fine-tuning前饋

           前饋網絡如圖5所示,train_x是patches_1和patches_2按行連接後的圖像,大小是181200*25,然後任取100行記爲batch_y,對batch_y加噪聲記爲batch_x(加噪聲的方式是將部分元素置0),對batch_x加一列全爲1的bias記爲nn.a{1},nn.a{1}乘以權重nn.W{1}(nn.W{1}等於前面訓練好的sae.ae{1}W{1}),再取sigmoid函數,加一列全1的bias記爲nn.a{2};nn.a{2}乘以權重nn.W{2}(nn.W{2}等於前面訓練好的sae.ae{2}W{1}),再取sigmoid函數,加一列全1的bias記爲nn.a{3}; nn.a{3}乘以權重nn.W{3}(nn.W{3}等於前面訓練好的sae.ae{2}W{2}),再取sigmoid函數,加一列全1的bias記爲nn.a{4}; nn.a{4}乘以權重nn.W{4}(nn.W{4}等於前面訓練好的sae.ae{1}W{2}),再取sigmoid函數記爲nn.a{5}; 網絡的最後輸出Z就是nn.a{5}。

誤差函數:

通過min 來得到新的權重。

2.2 nnbp函數

步驟同上

2.3 nnapplygrads函數

步驟同上

到這裏網絡完成一次訓練。

3,saetrain.m函數執行完成後,完成fine-tuning的訓練,新的權重W分別記爲sae.ae{1}W{1},sae.ae{1}W{2},sae.ae{2}W{1} ,sae.ae{2}W{2},

三、SDAE提取特徵

經過上面的pre-training和fine-tuning後,網絡就訓練好了,然後重新將train_x輸入網絡,就得到了20維特徵。最終的Z就是輸出的10維特徵。

圖7 SDAE提取特徵

 

 


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章