「UFLDL 無監督特徵學習」本節全稱爲自我學習與無監督特徵學習,和前一節softmax迴歸很相似,因此本篇筆記會比較簡化,主題思路和步驟以下:php
後面兩個步驟和前一節softmax迴歸相同,區別僅僅是輸入變成了原始數據的稀疏自編碼隱藏層激活值。html
特徵提取網絡組合形態git
根據前面的步驟描述,咱們要實現對有監督數據的特徵提取,爲了報出稀疏自編碼模塊sparseAutoencoderCost.m
的獨立性,單獨寫一個feedForwardAutoencoder.m
模塊來實現。代碼是否是很是簡單?github
function [activation] = feedForwardAutoencoder(theta, hiddenSize, visibleSize, data) W1 = reshape(theta(1:hiddenSize*visibleSize), hiddenSize, visibleSize); b1 = theta(2*hiddenSize*visibleSize+1:2*hiddenSize*visibleSize+hiddenSize); m = size(data,2); activation = sigmoid(W1*data + repmat(b1,1,m)); end function sigm = sigmoid(x) sigm = 1 ./ (1 + exp(-x)); end
從UFLDL原有代碼中能夠發現分類標籤從0-9移動到了1-10,緣由在於matlab的數組索引從1開始,最後作softmax判決時,找最大機率的分類的類別號獲得的是1-10,因此才作移動的。數據庫
此外練習說明中將類別爲6-10做爲無監督學習的素材,1-5做爲有監督softmax迴歸的素材,無非就是爲了判決出類別號後,統計準確率時能夠將softmaxPredict.m
輸出的類別號與測試集的真實label直接比較,不用考慮偏移的問題。數組
數據集仍然來自Yann Lecun的筆跡數據庫,再瞜一眼原始MMIST數據集的筆跡。網絡
設定與練習說明相同的參數,運行完整代碼https://github.com/codgeek/deeplearning 能夠看到預測準確率達到98.35%。達到了練習的標準結果。學習
回過來看一下,無監督學習到底學習到了什麼呢?測試
相似稀疏自編碼對邊緣的學習,上圖的特徵其實仍是稀疏自編碼學習到的阿拉伯數字的筆跡基本特徵,各類弧線樣式。另一點有點講究的是對總數據集合拆分兩組,也能夠不按照1-五、6-10來拆,若是按照數據集的前一半後一段拆成兩組。這樣無監督訓練數據就是全部0-9的數字筆跡,softmax判決的也是0-9的數字筆跡。代碼見stlExercise.m
的% 拆分無監督學習和softmax監督學習方法二
部分。優化
結果有些意外又能夠解釋:準確率爲95.8%。 能夠解釋爲稀疏自編碼、softmax有監督學習對每一個分類的數據量都減小了,在1E5量級上,數據量對結果好壞有明顯的影響。