實現自動便器的功能,除了本文件**章節所列出的**以外,還需要images.mat檔案和minfunc功能模組。minfunc功能模組用於實現l-bfgs演算法。
具體演算法可參看以下**的文件:
教程,不用於實現自動編碼器的功能,可以不執行。
train.m模組是整個自動編碼器執行的頂層**和框架;
sampleimages用於將影象資料檔案images.mat中的影象資料的格式進行調整以便於後續處理。
initializeparameters模組用於對theta引數進行初始化;
sparseautoencodercost模組用於實現自動編碼器的核心功能;
***putenumericalgradient模組用於計算數值梯度;
display_***works模組用於通過圖形化的形式顯示計算結果;
前言: 現在來進入sparse autoencoder的乙個例項練習,參考ng的網頁教程:exercise:
sparse autoencoder。這個例子所要實現的內容大概如下:從給定的很多張自然**中截取出大小為8*8的小patches**共10000張,現在需要用sparse autoencoder的方法訓練出乙個隱含層網路所學習到的特徵。
該網路共有3層,輸入層是64個節點,隱含層是25個節點,輸出層當然也是64個節點了。
實驗基礎:
其實實現該功能的主要步驟還是需要計算出網路的損失函式以及其偏導數,具體的公式可以參考前面的博文deep learning:八(sparse autoencoder)。下面用簡單的語言大概介紹下這個步驟,方便大家理清演算法的流程。
1. 計算出網路每個節點的輸入值(即程式中的z值)和輸出值(即程式中的a值,a是z的sigmoid函式值)。
2. 利用z值和a值計算出網路每個節點的誤差值(即程式中的delta值)。
3. 這樣可以利用上面計算出的每個節點的a,z,delta來表達出系統的損失函式以及損失函式的偏導數了,當然這些都是一些數學推導,其公式就是前面的博文deep learning:八(sparse autoencoder)了。
其實步驟1是前向進行的,也就是說按照輸入層——》隱含層——》輸出層的方向進行計算。而步驟2是方向進行的(這也是該演算法叫做bp演算法的**),即每個節點的誤差值是按照輸出層——》隱含層——》輸入層方向進行的。
一些malab函式:
bsxfun:
c=bsxfun(fun,a,b)表達的是兩個陣列a和b間元素的二值操作,fun是函式控制代碼或者m檔案,或者是內嵌的函式。在實際使用過程中fun有很多選擇比如說加,減等,前面需要使用符號』@』.一般情況下a和b需要尺寸大小相同,如果不相同的話,則只能有乙個維度不同,同時a和b中在該維度處必須有乙個的維度為1。
比如說bsxfun(@minus, a, mean(a)),其中a和mean(a)的大小是不同的,這裡的意思需要先將mean(a)擴充到和a大小相同,然後用a的每個元素減去擴充後的mean(a)對應元素的值。
rand:
生成均勻分布的偽隨機數。分布在(0~1)之間
主要語法:rand(m,n)生成m行n列的均勻分布的偽隨機數
rand(m,n,'double')生成指定精度的均勻分布的偽隨機數,引數還可以是'single'
rand(randstream,m,n)利用指定的randstream(我理解為隨機種子)生成偽隨機數
randn:
生成標準正態分佈的偽隨機數(均值為0,方差為1)。主要語法:和上面一樣
randi:
生成均勻分布的偽隨機整數
主要語法:randi(imax)在閉區間(0,imax)生成均勻分布的偽隨機整數
randi(imax,m,n)在閉區間(0,imax)生成mxn型隨機矩陣
r = randi([imin,imax],m,n)在閉區間(imin,imax)生成mxn型隨機矩陣
exist:
測試引數是否存在,比如說exist('opt_normalize', 'var')表示檢測變數opt_normalize是否存在,其中的』var』表示變數的意思。
colormap:
設定當前常見的顏色值表。
floor:
floor(a):取不大於a的最大整數。
ceil:
ceil(a):取不小於a的最小整數。
imagesc:
imagesc和image類似,可以用於顯示影象。比如imagesc(array,'erasemode','none',[-1 1]),這裡的意思是將array中的資料線性對映到[-1,1]之間,然後使用當前設定的顏色表進行顯示。此時的[-1,1]充滿了整個顏色表。
背景擦除模式設定為node,表示不擦除背景。
repmat:
該函式是擴充套件乙個矩陣並把原來矩陣中的資料複製進去。比如說b = repmat(a,m,n),就是建立乙個矩陣b,b中複製了共m*n個a矩陣,因此b矩陣的大小為[size(a,1)*m size(a,2)*m]。
使用函式控制代碼的作用:
不使用函式控制代碼的情況下,對函式多次呼叫,每次都要為該函式進行全面的路徑搜尋,直接影響計算速度,借助控制代碼可以完全避免這種時間損耗。也就是直接指定了函式的指標。函式控制代碼就像乙個函式的名字,有點類似於c++程式中的引用。
實驗流程:
首先執行主程式train.m中的步驟1,即隨機取樣出10000個小的patch,並且顯示出其中的204個patch影象,影象顯示如下所示:
然後執行train.m中的步驟2和步驟3,進行損失函式和梯度函式的計算並驗證。進行gradient checking的時間可能會太長,我這裡大概用了1個半小時以上(反正1個多小時還沒checking完,所以去睡覺了),當用gradient checking時,發現誤差只有6.
5101e-11,遠小於1e-9,所以說明前面的損失函式和偏導函式程式是對的。後面就可以接著用優化演算法來求引數了,本程式給的是優化演算法是l-bfgs。經過幾分鐘的優化,就出結果了。
最後的w1的權值如下所示:
根據**中的sparseautoencodercost模組進行說明。
%將長向量轉換成每一層的權值矩陣和偏置向量值;將theta中的資料賦值給w1,w2,b1,b2,這些矩陣的維度與其初始維度相同。
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 and gradient variables (your code needs to ***pute these values).
% here, we initialize them to zeros.
cost = 0;
w1grad = zeros(size(w1));
w2grad = zeros(size(w2));
b1grad = zeros(size(b1));
b2grad = zeros(size(b2));
jcost = 0;%直接誤差
jweight = 0;%權值懲罰
jsparse = 0;%稀疏性懲罰
[n m] = size(data);%m為樣本的個數,n為樣本的特徵數
%前向演算法計算各神經網路節點的線性組合值和active值
z2 = w1*data+repmat(b1,1,m);%注意這裡一定要將b1向量複製擴充套件成m列的矩陣
a2 = sigmoid(z2a(2)=f(z(2))
z3 = w2*a2+repmat(b2,1,m); %
a3 = sigmoid(z3
% % 計算**產生的誤差
jcost = (0.5/m)*sum(sum((a3-data).^2)); %
%計算權值懲罰項,即權值衰減項
jweight = (1/2)*(sum(sum(w1.^2))+sum(sum(w2.^2))); %
%計算稀釋性規則項; a2的取值為10000個64位的值,每個64位的值是乙個8*8影象的畫素值;
% sum(a2,2)計算出a2矩陣中10000個64位的值中,每組64位值的和。
% rho = (1/m).*sum(a2,2);%求出第乙個隱含層的平均值向量
jsparse = sum(sparsityparam.*log(sparsityparam./rho)+ ...
(1-sparsityparam).*log((1-sparsityparam)./(1-rho))); %
%損失函式的總表示式;
DeepLearning深度學習總結
一 deep learning的基本思想 假設我們有乙個系統s,它有n層 s1,sn 它的輸入是i,輸出是o,形象地表示為 i s1 s2 sn o,如果輸出o等於輸入i,即輸入i經過這個系統變化之後沒有任何的資訊損失 呵呵,大牛說,這是不可能的。資訊理論中有個 資訊逐層丟失 的說法 資訊處理不等式...
深度學習心得 李明
深度學習之單元教學主體學習心得 李明主題單元教學是根據課程實施的水平目標,確立若干個教學主題,教師遵循學生身心的一般規律,以主題為線索,開發和重組相關的教學內容,進行連續課時單元教學的教學方式。開展主題單元教學時為了體現學習領域水平目標達成的針對性 知識技能教學的連貫性和開放性 生活化等特性,將整個...
自動離職及解雇之程式
者。2 即時解雇主要原因 凡犯上嚴重過失者。在接受最後警告或屢次接受警告後再觸犯同樣或其他任何紀律或酒店規條者。觸犯地方或國家刑事法例而被判勞動教養或受刑事處分者。注 以上之具體細則可參閱 即時解雇 pp ex pt 022 之規定。3 程式 當部門經理需要辭退其觸犯規條的員工時,必須填寫乙份紀律警...