線性解碼器——解決數據縮放問題

稀疏自編碼器效果不錯,但是有個固有缺陷:必須對輸入數據的範圍縮放到(0,1)。

 

設想一個圖像如果不經預處理,直接把大於1的值輸入稀疏自編碼器,那麼被sigmoid一下,就成了(0,1)的範圍了,再被sigmoid一下,還是在(0,1)範圍。這樣殘差根本沒辦法算,因爲經過了sigmoid變換之後的數據已經不可能與輸入數據相等了。

 

但是如果我們把第三層,原先的sigmoid函數換成恆等函數,事情就發生了變化。


 

這樣我們就能用實值輸入,不需要放縮樣本到(0,1)範圍,比如這在處理彩色圖像、PCA白化時是很難做到的。

 

因此我們只需要再對稀疏自編碼算法的最後一層的殘差稍作修改即可


 

代碼如下

 

function [cost,grad,features] = sparseAutoencoderLinearCost(theta, visibleSize, hiddenSize, ...
                                                            lambda, sparsityParam, beta, patches)
                                
W1 = reshape(theta(1:hiddenSize*visibleSize), hiddenSize, visibleSize);
W2 = reshape(theta(hiddenSize*visibleSize+1:2*hiddenSize*visibleSize), visibleSize, hiddenSize);
b1 = theta(2*hiddenSize*visibleSize+1:2*hiddenSize*visibleSize+hiddenSize);
b2 = theta(2*hiddenSize*visibleSize+hiddenSize+1:end);

cost = 0;
W1grad = zeros(size(W1)); 
W2grad = zeros(size(W2));
b1grad = zeros(size(b1)); 
b2grad = zeros(size(b2));

numpatches=size(patches,2);
a2=sigmoid(W1*patches+repmat(b1,1,numpatches));
a3=W2*a2+repmat(b2,1,numpatches);%更改
Rho=sum(a2,2)/numpatches;
Penalty=-sparsityParam./Rho+(1-sparsityParam)./(1-Rho);
Delta3=(a3-patches);%更改
Delta2=(W2'*Delta3+beta*repmat(Penalty,1,numpatches)).*a2.*(1-a2);
cost1=sumsqr(a3-patches)/numpatches/2;
cost2=(sumsqr(W1)+sumsqr(W2))*lambda/2;
cost3=beta*sum(sparsityParam*log(sparsityParam./Rho)+(1-sparsityParam)*log((1-sparsityParam)./(1-Rho)));
cost=cost1+cost2+cost3;
W2grad=Delta3*a2'/numpatches+lambda*W2;
b2grad=sum(Delta3,2)/numpatches;
W1grad=Delta2*patches'/numpatches+lambda*W1;
b1grad=sum(Delta2,2)/numpatches;

grad = [W1grad(:) ; W2grad(:) ; b1grad(:) ; b2grad(:)];
end

function sigm = sigmoid(x)
  
    sigm = 1 ./ (1 + exp(-x));
end

圖像是彩色的,所以有3通道,輸入維數8*8*3,原始圖像樣例如圖1


圖1


在使用了ZCA之後,圖像變得銳利了,如圖2


圖2


通過線性解碼器,可以學習得到400個特徵如圖3


圖3


歡迎參與討論並關注本博客微博以及知乎個人主頁後續內容繼續更新哦~

轉載請您尊重作者的勞動,完整保留上述文字以及文章鏈接,謝謝您的支持!



發佈了54 篇原創文章 · 獲贊 86 · 訪問量 47萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章