1. 程式人生 > >深度學習入門教程UFLDL學習實驗筆記一:稀疏自編碼器

深度學習入門教程UFLDL學習實驗筆記一:稀疏自編碼器

UFLDL即(unsupervised feature learning & deep learning)。這是斯坦福網站上的一篇經典教程。顧名思義,你將在這篇這篇文章中學習到無監督特徵學習和深度學習的主要觀點。

UFLDL全文出處在這:http://ufldl.stanford.edu/wiki/index.php/UFLDL%E6%95%99%E7%A8%8B,本文為本人原創,參考了UFLDL的教程,是我自己個人對於這一系列教程的理解以及自己的實驗結果。非盈利性質網站轉載請在文章開頭處著名本文作者:77695,來源http://www.cnblogs.com/cj695/。盈利性質網站轉載請與作者聯絡,聯絡方式在文章後面。如未聯絡,本人將通過一切可能且合法的途徑追繳相應稿酬。請在轉載時保留此宣告。

神經網路

一個神經網路由一系列神經元組成,一個神經元由一系列引數x1,x2。。。及偏置量+1作為輸入,將輸入與對應權值W(與x1,x2。。。相乘),(與1相乘)相乘後求和,並將和放入啟用函式,即可得到該神經元的輸出。我們稱這個神經元的輸入-輸出對映關係其實就是一個邏輯迴歸(logistic regression)

image

在這裡啟用函式我們用:

image他的導數是右邊的形式image

這是sigmoid函式的影象

image

整個神經元可以用一個公式表示:

image

神經網路就是很多個神經元組合在一起,一個神經元的輸出,也可以是另外一個神經元的輸入,如下圖:

image

具體請直接檢視UFLDL相應教程,這裡不再贅述,下文一樣。

反向傳導演算法

一個神經網路向前傳導,其神經元的引數可以是各種各樣的,這樣也會導致各種各樣的借,而我希望我整個神經網路的輸出,是與我預期的輸出越相近越好,為了描述相近的程度,我們計算神經網路輸出與預計輸出的差值的平方和。這個和越小,即輸出與預期越接近,我們稱這個叫做代價函式。但使得輸出與預期接近的W引數組合有很多,並不是每一種組合都好,也不是說越接近越好,當W引數太大的時候,會發生過擬合,使得泛化能力不夠,因此我們引入所有W的平方和,加入到代價函式中,我們稱它叫懲罰項。我們使用梯度下降法,求得最優的W,b這就是機器學習的整個過程。梯度下降中,其實就是求得代價函式對W,b的偏導值。在計算偏導的時候,因為複合函式的求導法則:

image

可以看到,要求整個懲罰函式的導數首先就要計算從懲罰函式開始向後求導,具體公式這裡就不貼了。

梯度檢驗

要檢測自己反向傳導得到的偏導函式是否正確,這裡有一種簡單粗暴的方法,就是梯度檢驗,通過對某一個引數加以及減一個較小的值的差除以2倍較小的值即可近似算出該點偏導值,因此可以用來檢驗偏導是否計算正確。但為什麼我們不直接用這個計算代替求偏導函式,因為太慢了!

imageimage

在這裡我們用L-BFGS演算法快速計算偏導數

自編碼演算法與稀疏性

image

使得輸出儘可能與輸入一致我們稱之為自編碼。比如,若隱藏層神經元數目小於輸入層,則這個網路就要學習怎麼去壓縮這些資料。使得神經元大部分的時間都是被抑制的限制則被稱作稀疏性限制。其懲罰函式如下:

image

image

image

視覺化自編碼器訓練結果

可以證明,image時有單元i有最大激勵。

實現

生成資料集:即從所有10副512x512的圖片中取8x8的塊,一共取10000塊。

imageimageimage

這是資料集的一些圖片,可以看到這主要是一些自然圖片。

這裡只貼上所有自己實現部分的程式碼。

[w,h,n]=size(IMAGES);
randx=randi(w-patchsize,1,numpatches);
randy=randi(h-patchsize,1,numpatches);
randIdx=randi(n,1,numpatches);


for i=1 : numpatches
    pc=IMAGES(randx(i):randx(i)+patchsize-1,randy(i):randy(i)+patchsize-1,randIdx(i));
    patches(:,i)=pc(:);
end

生成結果如下:

image

實現懲罰函式以及梯度函式:按照之前的公式計算,大家直接看程式碼吧。

[l,n]=size(data);
dataHidden=sigmoid(W1*data+b1*ones(1,n));
dataOut=sigmoid(W2*dataHidden+b2*ones(1,n));
rou=sum(dataHidden,2)/n;
spCost=beta*(sum((sparsityParam*log(sparsityParam*ones(size(rou))./rou)...
    +(1-sparsityParam)*log(((1-sparsityParam)*ones(size(rou)))./(1-rou)))));
xyCost=(sum(sum((dataOut-data).*(dataOut-data))))/2/n;
wCost=(lambda/2)*((sum(sum(W1.*W1))+sum(sum(W2.*W2))));
cost=wCost+xyCost+spCost;
delta3=-(data-dataOut).*dataOut.*(1-dataOut);
spDt=beta*((-sparsityParam*ones(size(rou))./rou)+(((1-sparsityParam)...
    *ones(size(rou)))./(ones(size(rou))-rou)));
delta2=((W2')*delta3+spDt*ones(1,n)).*dataHidden.*(1-dataHidden);
W2grad=(delta3*(dataHidden'))/n+lambda*W2;
W1grad=(delta2*(data'))/n+lambda*W1;
b2grad=delta3*ones(n,1)/n;
b1grad=delta2*ones(n,1)/n;

實現時候出了一個問題,算梯度的時候少加了lambda*W1,粗心害死人啊!

梯度檢驗:按照公式實現梯度檢驗,檢驗實現的梯度是否正確。

for i=1 :(size(theta,1))
    e = zeros(size(theta));
    e(i)=EPSILON;
    cha=(J(theta+e)-J(theta-e));
    numgrad(i)=cha/(2*EPSILON);
end

看到執行結果

image

只差10^-12數量級,說明梯度檢驗的實現沒錯

訓練以及結果:

最後執行得到結果如下:

image

可以看到學習出來的結果基本是圖片相互正交的部分,相當於傅立葉變換中不同頻率正弦波,相當於很多正交的基,這些“基”以一定的權重相加,就能夠近似組成任何一個8x8的圖片塊。

另外值得一提的是,對於梯度下降演算法,在這裡使用的是L-BFGS演算法,對於這個演算法,我們不能將它用於商業用途,若用與商業用途的話,可以使用fminlbfgs函式,他比L-BFGS慢但可用於商業用途。

相關推薦

深度學習入門教程UFLDL學習實驗筆記稀疏編碼

UFLDL即(unsupervised feature learning & deep learning)。這是斯坦福網站上的一篇經典教程。顧名思義,你將在這篇這篇文章中學習到無監督特徵學習和深度學習的主要觀點。 UFLDL全文出處在這:http://ufldl.stanford.edu/wiki/

深度學習入門教程UFLDL學習實驗筆記使用向量化對MNIST資料集做稀疏編碼

今天來做UFLDL的第二個實驗,向量化。我們都知道,在matlab裡面基本上如果使用for迴圈,程式是會慢的一逼的(可以說基本就執行不下去)所以在這呢,我們需要對程式進行向量化的處理,所謂向量化就是將matlab裡面所有的for迴圈用矩陣運算的方法實現,在這裡呢,因為之前的實驗我已經是按照向量化的形式編寫的程

深度學習入門教程UFLDL學習實驗筆記主成分分析PCA與白化whitening

主成分分析與白化是在做深度學習訓練時最常見的兩種預處理的方法,主成分分析是一種我們用的很多的降維的一種手段,通過PCA降維,我們能夠有效的降低資料的維度,加快運算速度。而白化就是為了使得每個特徵能有同樣的方差,降低相鄰畫素的相關性。 主成分分析PCA 第一步:首先我們需要獲取旋轉矩陣U,為了實現這一目的,我

深度學習筆記稀疏編碼(1)——神經元與神經網路

  筆者在很久以前就已經學習過UFLDL深度學習教程中的稀疏自編碼器,近期需要用到的時候發現有些遺忘,溫習了一遍之後決定在這裡做一下筆記,本文不是對神經元與神經網路的介紹,而是筆者學習之後做的歸納和整理,打算分為幾篇記錄。詳細教程請見UFLDL教程,看完教程之後

tensorflow學習筆記(三)實現編碼

sea start ear var logs cos soft 編碼 red 黃文堅的tensorflow實戰一書中的第四章,講述了tensorflow實現多層感知機。Hiton早年提出過自編碼器的非監督學習算法,書中的代碼給出了一個隱藏層的神經網絡,本人擴展到了多層,改進

DeepLearning學習隨記(稀疏編碼

                講義從稀疏自編碼(Sparse Autoencoder)這一章節開始講起。前面三節是神經網路、BP神經網路以及梯度檢驗的方法。由於還有點神經網路的相關知識,這部分不是太難懂。就從自編碼器和稀疏性(Autoencoders and sparisity)記起吧。稀疏自編碼器構建:假

UFLDL稀疏編碼

吳恩達的 CS294A 是一門很好的深度學習入門課程,打算接下來的學習以這個課程的內容為主。UFLDL Tutorial 是 CS294A 課程的 wiki 頁,包含了課程講義和作業。如果你對 監督學習、邏輯迴歸、梯度下降 等基礎概念並不熟悉,可以先學習 之前的

ufldl 深度學習入門 第一發基於BP網路實現稀疏編碼

目的:打算使用深度學習的方式實現人臉關鍵點的檢測,第一步是要學習深度學習。 步驟:第一步在ufldl上面學習深度學習的演算法基礎知識,然後找部落格上基於python呼叫theano庫實現人臉關鍵點檢測的演算法,看懂後基於C++實現,然後用java實現app,呼叫C++實現的

深度學習入門 ---稀疏編碼

在學習稀疏自編碼器之前,需要讀者有BP神經網路的基礎 1. 為什麼要用稀疏自編碼器   對於沒有帶類別標籤的資料,由於為其增加類別標記是一個非常麻煩的過程,因此我們希望機器能夠自己學習到樣本中的一些重要特徵。通過對隱藏層施加一些限制,能夠使得它在惡劣

csdn學習筆記lua 迭代

  無狀態的迭代器(不使用閉包方式), ipairs函式 a = {10,20,30,40,50,60} for k,v in ipairs(a) do print(k,v); end ----------------------------- output: 1

【TensorFlow-windows】學習筆記六——變分編碼

前言 對理論沒興趣的直接看程式碼吧,理論一堆,而且還有點複雜,我自己的描述也不一定準確,但是程式碼就兩三句話搞定了。 國際慣例,參考博文 理論 基礎知識 似然函式(引自百度百科) 似然函式是關於統計模型中的引數的函式,

系統學習深度學習(二) --編碼,DA演算法,SDA,稀疏編碼

轉自:http://www.cnblogs.com/neopenx/p/4370350.html,作者寫的很好,輕鬆易懂。 起源:PCA、特徵提取.... 隨著一些奇怪的高維資料出現,比如影象、語音,傳統的統計學-機器學習方法遇到了前所未有的挑戰。 資料維度過高,資料單

『TensorFlow』讀書筆記_降噪編碼

沒有 tutorials oftp transfer 初始化 hot nis gauss ant 『TensorFlow』降噪自編碼器設計 之前學習過的代碼,又敲了一遍,新的收獲也還是有的,因為這次註釋寫的比較詳盡,所以再次記錄一下,具體的相關知識查閱之前寫的文章即可(見

UFLDL向量化程式設計練習用MNIST資料集的稀疏編碼訓練實現

     折騰了兩天,總算實現了用MNIST資料集的稀疏自編碼器訓練。發現了以下問題:      1,matlab程式設計所寫程式碼不能太奢侈。定義變數時要儘量節省記憶體資源,向量能解決的不要用方陣,int8型別能解決的不要用雙精度數;      2,UFLDL提供的min

Deep Learning 16編碼對資料進行降維_讀論文“Reducing the Dimensionality of Data with Neural Networks”的筆記

前言 筆記 摘要:高維資料可以通過一個多層神經網路把它編碼成一個低維資料,從而重建這個高維資料,其中這個神經網路的中間層神經元數是較少的,可把這個神經網路叫做自動編碼網路或自編碼器(autoencoder)。梯度下降法可用來微調這個自動編碼器的權值,但是隻有在初始化權值較好時才能得到最優解,不然就

深度學習入門---Keras報錯集合筆記

[錯誤1]在model.fit()呼叫之後會出現如下錯誤說明:Cannot interpret feed_dict key as Tensor: Tensor Tensor("conv2d_1_input:0", shape=(?, 256, 196, 3), ,dtype=

js學習入門教程筆記css+html+js使用者註冊程式碼實現

執行截圖:如下: 使用者註冊:結構層:html;表現層:css;行為層:javascript; html利用ul,li來構造:     注意事項:1、每個Input都要有相應的id,這是在js中去呼叫的。                   2、<a href

基於PyTorch的深度學習入門教程(八)——影象風格遷移

前言 本文介紹怎樣執行Neural-Style演算法。Neural-Style或者叫做Neural-Transfer,將一個內容影象和一個風格影象作為輸入,返回一個按照所選擇的風格影象加工的內容影象。 原理是非常簡單的:我們定義兩個距離,一個用於內容(Dc)

深度學習入門之pythoch》 讀書筆記——卷積神經網路

之前就購買了這本書,但是一直處於閒看的狀態,時至年底,深感不能再繼續之前狀態,故從正在閱讀的部分開始寫讀書筆記,之前的會在後邊補充。 原理和結構 卷積神經網路以其強大的計算機視覺能力倍受人們的青睞。 作者首先提出了三個觀點,也就是圖片的三個性質,分別是

基於PyTorch的深度學習入門教程(四)——構建神經網路

前言本文參考PyTorch官網的教程,分為五個基本模組來介紹PyTorch。為了避免文章過長,這五個模組分別在五篇博文中介紹。本文是關於Part3的內容。Part3:使用PyTorch構建一個神經網路神