UFLDL教程: Exercise:Self-Taught Learning
自我學習
Deep Learning and Unsupervised Feature Learning Tutorial Solutions
1.先訓練稀疏自編碼器提取特征,再把特征和label給softmax分類器進行訓練,最后用test數據集進行測試。
2.由于實際應用中找到大量有標注的樣本是非常困難的,所有采用先用大量無標注樣本來進行無監督訓練自編碼器,再用自編碼器來提取特征,配合有標注樣本來進行有監督訓練softmax分類器。
3.數據預處理方面:例如,如果對未標注數據集進行PCA預處理,就必須將得到的矩陣 U 保存起來,并且應用到有標注訓練集和測試集上;而不能使用有標注訓練集重新估計出一個不同的矩陣 U (也不能重新計算均值并做均值標準化),否則的話可能得到一個完全不一致的數據預處理操作,導致進入自編碼器的數據分布迥異于訓練自編碼器時的數據分布。
4.自學習(self-taught learning) 不要求未標注數據 x_u 和已標注數據 x_l 來自同樣的分布。另外一種帶限制性的方式也被稱為半監督學習,它要求 x_u和 x_l 服從同樣的分布。
流程圖
稀疏自編碼器學習圖像特征(實現自學習)—用到無標簽的樣本集
softmax回歸對樣本分類—用到有標簽的訓練樣本集
步驟
第0步:設置神經網絡的結構
該神經網絡包括三層:
輸入層的神經元個數(數字識別,則設置輸入的圖像大小)
輸出端的神經元個數(也就是類別數)
隱藏層神經元個數
另外一些關于系數編碼的參數
sparsityParam、lambda、beta
最大迭代次數:maxIter
第一步:產生無標簽樣本集和有標簽樣本集(訓練數據集和測試數據集)
1)導入數據集mnistData和mnistLabels
mnistData是一個矩陣,每一列為一個輸入樣本(也就是一個輸入的數字圖像所有像素點按列排布)
mnistLabels是一個向量,它存儲的數字表示mnistData中每一列樣本的類別
(2)將輸入的樣本集mnistData進行分組
① 首先,將mnistData分為兩組:一組為有標簽的數據集(數字0-4的樣本),另一組為無標簽的數據集(數字5-9的樣本)
(這兩組的指標集分別為labeledSet和unlabeledSet)
② 然后,再將有標簽的數據集平均分為兩組,一組作為訓練集、一組作為測試集;
(這兩組的指標集分別為trainSet和testSet)
這里的指標,指在mnistData中的列序號
③ 分別得到上述三組指標集得到相應的數據集,并得到有標簽數據集的標簽
unlabeledData:無標簽數據集,每一列為一個樣本
trainData:有標簽訓練集,每一列為一個樣本,相應的標簽存放在trainLabels中
testData:有標簽測試集,每一列為一個樣本,相應的標簽存放在testLabels中
用29404個無標注數據unlabeledData(手寫數字數據庫MNIST Dataset中數字為5-9的數據)來訓練稀疏自動編碼器,得到其權重參數opttheta。這一步的目的是提取這些數據的特征,雖然我們不知道它提取的究竟是哪些特征(當然,可以通過可視化結果看出來,可假設其提取的特征為Features),但是我們知道它提取到的特征實際上就是已訓練好的稀疏自動編碼器的隱藏層的激活值(即:第2層激活值)。注意:本節所有訓練稀疏自動編碼器的算法用的都L-BFGS算法。
第二步:訓練稀疏自編碼器
利用無標簽數據集unlabeledData訓練稀疏自編碼器
① 初始化化自編碼器的參數theta
② 調用minFunc中的最優化函數,計算得到稀疏自編碼器的參數
包括設置minFunc函數的一些參數及對minFunc函數的調用,這里要用到稀疏自編碼器的代價函數和梯度計算的函數sparseAutoencoderCost
第三步:利用稀疏自編碼器對有標簽的訓練樣本集和測試樣本集提取特征
在得到稀疏自編碼器后,可以利用它從有標簽的數據集中提取圖像特征,這里需要完成feedForwardAutoencoder.m函數
所謂圖像的特征,其實就是指該圖像在稀疏自編碼器的權值矩陣W1作用下得到的隱藏層的輸出
可以得到訓練集的特征trainFeatures和測試集的特征testFeatures
它們的每一列分別是由稀疏自編碼器提取出的特征
訓練樣本集提取特征
把15298個已標注數據trainData(手寫數字數據庫MNIST Dataset中數字為0-4的前一半數據)作為訓練數據集通過這個已訓練好的稀疏自動編碼器(即:權重參數為opttheta的稀疏自動編碼器),就可提取出跟上一步一樣的相同的特征參數,這里trainData提取的特征表達假設為trainFeatures,它其實也是隱藏層的激活值。如果還不明白,這里打一個比方:假設上一步提取的是一個通信信號A(對應unlabeledData)的特征是一階累積量,而這一步提取的就是通信信號B(對應trainData)的一階累積量,它們提取的都是同樣的特征,只是對象不同而已。同樣地,unlabeledData和trainData提取的是同樣的特征Features,只是對象不同而已。
測試樣本集提取特征
把15298個已標注數據testData(手寫數字數據庫MNIST Dataset中數字為0-4的后一半數據)作為測試數據集通過這個已訓練好的稀疏自動編碼器(即:權重參數為opttheta的稀疏自動編碼器),就可提取出跟上一步一樣的相同的特征參數,這里testData提取的特征表達假設為testFeatures,它其實也是隱藏層的激活值。
注意:如果上一步對unlabeledData做了預處理,一定要把其各種數據預處理參數(比如PCA中主成份U)保存起來,因為這一步的訓練數據集trainData和下一步的測試數據集testData也一定要做相同的預處理。本節練習,因為用的是手寫數字數據庫MNIST Dataset,已經經過了預處理,所以不用再預處理。
具體見:http://ufldl.stanford.edu/wiki/index.php/%E8%87%AA%E6%88%91%E5%AD%A6%E4%B9%A0
第四步:利用訓練樣本集訓練softmax回歸模型
利用訓練集的特征集trainFeatures及其標簽集trainLabels,訓練softmax回歸模型
注:softmaxTrain函數的輸入參數(特征維數,標簽數,懲罰項權值λ,訓練數據集的數據,訓練數據集的標簽,其他參數)
把第三步提取出來的特征trainFeatures和已標注數據trainData的標簽trainLabels作為輸入來訓練softmax分類器,得到其回歸模型softmaxModel。
第五步:對測試數據集進行分類
利用得到的softmax回歸模型對測試集進行分類
把第三步提取出來的特征testFeatures輸入訓練好的softmax回歸模型softmaxModel,從而預測出已標注數據testData的類別pred,再把pred和已標注數據testData本來的標簽testLabels對比,就可得出正確率。
綜上,Self-taught learning是利用未標注數據,用無監督學習來提取特征參數,然后用有監督學習和提取的特征參數來訓練分類器。
本次實驗主要是進行0~4這5個數字的分類,雖然進行無監督訓練用的是數字5~9的訓練樣本,這依然不會影響后面的結果。
5-9的數字進行降維的訓練,訓練出一般圖像到低維空間的表示矩陣W和B,后用W和B,將要分類的圖像0-4用低維表示.
function [activation] = feedForwardAutoencoder(theta, hiddenSize, visibleSize, data) % 該函數的作用是:利用稀疏自編碼器從數據中提取特征 % theta: trained weights from the autoencoder % visibleSize: the number of input units (probably 64) % hiddenSize: the number of hidden units (probably 25) % data: Our matrix containing the training data as columns. So, data(:,i) is the i-th training example. % We first convert theta to the (W1, W2, b1, b2) matrix/vector format, so that this % follows the notation convention of the lecture notes. W1 = reshape(theta(1:hiddenSize*visibleSize), hiddenSize, visibleSize); b1 = theta(2*hiddenSize*visibleSize+1:2*hiddenSize*visibleSize+hiddenSize);%% ---------- YOUR CODE HERE -------------------------------------- % Instructions: Compute the activation of the hidden layer for the Sparse Autoencoder. activation=sigmoid(W1*data+repmat(b1,1,size(data,2)));%-------------------------------------------------------------------end%------------------------------------------------------------------- % Here's an implementation of the sigmoid function, which you may find useful % in your computation of the costs and the gradients. This inputs a (row or % column) vector (say (z1, z2, z3)) and returns (f(z1), f(z2), f(z3)). function sigm = sigmoid(x)sigm = 1 ./ (1 + exp(-x)); end
參考文獻
UFLDL教程(五)之self-taught learning
Deep Learning 7_深度學習UFLDL教程:Self-Taught Learning_Exercise(斯坦福大學深度學習教程)
自我學習
Deep Learning 6_深度學習UFLDL教程:Softmax Regression_Exercise(斯坦福大學深度學習教程)
吳恩達 Andrew Ng 的公開課
總結
以上是生活随笔為你收集整理的UFLDL教程: Exercise:Self-Taught Learning的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: UFLDL教程:Exercise:Sof
- 下一篇: 农行燃梦白金信用卡不激活收年费吗?有什么