1. 程式人生 > >深度學習系列(六):自編碼網路的特徵學習

深度學習系列(六):自編碼網路的特徵學習

在第三節我們已經介紹了

知道了自編碼學習其實就是學習到了輸入資料的隱含特徵,通過新的特徵來表徵原始資料,本節將介紹如何使用這些隱含特徵進行模式分類;
還是以前面的三層自編碼網路:
這裡寫圖片描述
抽象一下如下:
這裡寫圖片描述
其中學習到的權值係數W1與W1’是不一樣的,我們把W1叫做編碼權值,W1’叫做譯碼權值,原始資料在編碼權值下的新資料Y就可以視為學習到了新維度下的資料,這在第三節也說過。那麼如果我們用自編碼學習並計算出到Y,再把Y用於分類,就可以構成神經網路的分類器了,網路深了就是深度網路的分類器了,當然後面接分類器可以是常用的分類器,比如SVM,貝葉斯,logistics,等等,也可以在接一個神經網路分類器。本實驗為了比較我們在Y後面接SVM分類器看看,那麼在上面一步完成後我們的分類器就變成下面這樣子:
這裡寫圖片描述


這裡我們以手寫體實驗,所以輸入固定了為784維。至於隱含層為多少是可以設計的k。

Ok理論分析到此,我們來看看上節介紹的工具箱如何實現吧

首先是三層自編碼網路的實現,假設k=100吧,那麼我們網路結構是不是[784,100,784],像第三節做的那樣,只不過第三節沒有權值的稀疏性,而在這裡我們要加入稀疏性了與一些去噪功能了。

Ok找到在工具箱DeepLearnToolbox\tests\test_example_SAE.m檔案
把要說明的拿出來:

function test_example_SAE
load mnist_uint8;
choose_num_train = 10000;
choose_num_test= 200
; %初始化預處理 train_x = double(train_x(1:choose_num_train,:))/255; test_x = double(test_x(1:choose_num_test,:))/255; train_y = double(train_y(1:choose_num_train,:)); test_y = double(test_y(1:choose_num_test,:)); %% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN % Setup and train a stacked denoising autoencoder (SDAE)
rand('state',0) sae = saesetup([784 100]);%自編碼網路的初始化,輸出==輸入,所以省略第三個784 sae.ae{1}.activation_function = 'sigm';%將隱含層啟用函式設定為sigm sae.ae{1}.learningRate = 1;%定義學習率 sae.ae{1}.inputZeroMaskedFraction = 0.5;%定義0模板大小 opts.numepochs = 1;%重複迭代次數 opts.batchsize = 100;%資料塊大小--每一塊用於一次梯度下降演算法 sae = saetrain(sae, train_x, opts);%訓練 visualize(sae.ae{1}.W{1}(:,2:end)')%視覺化編碼矩陣的權值

對此在說明幾點:
(1)自編碼網路的初始化saesetup,開啟看看

function sae = saesetup(size)
    for u = 2 : numel(size)
        sae.ae{u-1} = nnsetup([size(u-1) size(u) size(u-1)]);
    end
end

可以看到網路為[size(u-1) size(u) size(u-1)],因為是自編碼輸出等於輸入個數;

(2)關於自編碼的nnsetup,在這個nnsetup裡面,因為我們想適當的稀疏下權值,所以改變初始化的引數nn.nonSparsityPenalty,假設設定為0.05.

(3)關於另一個引數說明:sae.ae{1}.inputZeroMaskedFraction =0.5,這個引數是什麼意思呢?就是以一定概率將輸入值變成0,增加輸入的魯棒性,抗噪聲能力。我們可以再nntrain裡面看到程式碼:

  %Add noise to input (for use in denoising autoencoder)
        if(nn.inputZeroMaskedFraction ~= 0)
            batch_x = batch_x.*(rand(size(batch_x))>nn.inputZeroMaskedFraction);
        End

這就是當inputZeroMaskedFraction 不為0時需要執行的,看看執行了什麼,是不是人為將一些輸入改變成0了呀?更直觀的解釋為,比如一個輸入來了,大小為784*1,假設裡面有100個0,那麼經過這麼段程式後可能就變成了200個0了,防止過擬合作用,理解了吧,對於這種抗造性的網路修改操作,還有一篇相關論文專門介紹的可以看看http://www.cs.toronto.edu/~hinton/absps/dropout.pdf

最後就是視覺化這個結果了,那麼視覺化的是編碼權值矩陣,也就是W1。按照上面的設定我們先來看看視覺化的結果吧(第三節我們也有視覺化的介紹,在哪裡效果可不怎麼樣):
注意需要設定的幾個引數:要把nnsetup裡面的nn.nonSparsityPenalty=0.05)
這裡寫圖片描述
可以看到,編碼矩陣的視覺化結果,很明顯的有一些手寫體輪廓痕跡吧。把nn.nonSparsityPenalty調厲害點比如為0.2,結果為:
這裡寫圖片描述
差了點吧,稀疏的越厲害,表示權值中需要歸0或者很小的權值就越多,那麼表示出來就是上面這個樣子。這說明稀疏太狠了,就好像第四節中解釋的那樣子,本來一個向量至少需要3個基向量來表示才行,你非要稀疏到用一個基向量表示,結果能不差嗎?

Ok,再來解釋下這個視覺化的結果到底是什麼吧。把訓練好的網路拿出來這樣子的:
這裡寫圖片描述

好了對於隱含層的100個單元的每一個單元,比如Y1,那麼所有輸入是不是有個權值到Y1,從Y(1,1)到Y(1,784),如上所示。那麼再把這784向量變成28*28影象顯示出來,就是輸入相對於第一個隱含單元學到的特徵權值,得到的值Y就是在這個隱含單元下的特徵。這樣還有其他99個隱含單元都顯示出來就是上述見到的那個100個圖了,每個圖的大小為28*28。當然具體視覺化的時候可能把資料歸一化了等等處理了才顯示出來的。

至此自編碼特徵學習、視覺化到此了。784維資料經過編碼就變成100維了,其實呢這個過程就是降維了,這就不經想起了這個過程非常像資料的PCA降維是不是,假設取784PCA一下變成100,你去研究發現他們出來的這100維結果其實很像,然而自編碼更好,為什麼?PCA畢竟給了個規則然後提取的特徵,然而自編碼呢?機器學習到的特徵,這也就是為什麼深度學習效果好,因為他的特徵是自己學的,擺脫了傳統意義上的手工設計的特徵,相比之下,人再聰明,在其他條件一致的情況下,能比得過機器?而模式識別分類領域最重要的是什麼?特徵的選擇,當特徵的選擇也可以用機器來做的時候,那麼偉大的革新就即將誕生。

Ok扯遠了,為了進一步比較深度學習學到的特徵用於分類,以及與PCA的比較,待下回分享。

相關推薦

深度學習系列()編碼網路特徵學習

在第三節我們已經介紹了 知道了自編碼學習其實就是學習到了輸入資料的隱含特徵,通過新的特徵來表徵原始資料,本節將介紹如何使用這些隱含特徵進行模式分類; 還是以前面的三層自編碼網路: 抽象一下如下: 其中學習到的權值係數W1與W1’是不一樣的,我

深度學習系列(七)編碼網路與PCA特徵學習的分類對比實驗

上節我們看到自編碼網路額隱含層可以用於原始資料的降維(其實也可以升維,不過把隱含層的單元設定的比輸入維度還要多),換而言之就是特徵學習,那麼學習到的這些特徵就可以用於分類了,本節主要試驗下這些特徵用於分類的效果。 先以最簡單的三層自編碼網路為例,先訓練自編碼網

tensorflow學習系列mnist從訓練儲存模型再到載入模型測試

    通過前面幾個系列的學習對tensorflow有了一個漸漸親切的感覺,本文主要是從tensorflow模型訓練與驗證的模型進行實踐一遍,以至於我們能夠通過tensorflow的訓練有一個整體的概念。下面主要是從訓練到儲存模型,然後載入模型進行預測。# -*- codin

Java NIO學習系列Java中的IO模型

  前文中我們總結了linux系統中的5中IO模型,並且著重介紹了其中的4種IO模型: 阻塞I/O(blocking IO) 非阻塞I/O(nonblocking IO) I/O多路複用(IO multiplexing) 非同步I/O(asynchronous IO)   但是前面總結的IO

Vue.js學習系列——Vue單元測試Karma+Mocha學習筆記

在使用vue-cli建立專案的時候,會提示要不要安裝單元測試和e2e測試。既然官方推薦我們使用這兩個測試框架,那麼我們就動手去學習實踐一下他們吧。 簡介 Karma Karma是一個基於Node.js的JavaScript測試執行過程管理工

機器學習深度學習系列連載 第二部分 深度學習(十)迴圈神經網路 4(BiDirectional RNN, Highway network, Grid-LSTM)

深度學習(十六)迴圈神經網路 4(BiDirectional RNN, Highway network, Grid-LSTM) RNN處理時間序列資料的時候,不僅可以正序,也可以正序+逆序(雙向)。下面顯示的RNN模型,不僅僅是simple RNN,可以是LSTM,或者GRU 1 B

機器學習深度學習系列連載 第二部分 深度學習(十五)迴圈神經網路 3(Gated RNN - GRU)

迴圈神經網路 3(Gated RNN - GRU) LSTM 是1997年就提出來的模型,為了簡化LSTM的複雜度,在2014年 Cho et al. 提出了 Gated Recurrent Units (GRU)。接下來,我們在LSTM的基礎上,介紹一下GRU。 主要思路是: •

機器學習深度學習系列連載 第二部分 深度學習(十四)迴圈神經網路 2(Gated RNN - LSTM )

迴圈神經網路 2(Gated RNN - LSTM ) simple RNN 具有梯度消失或者梯度爆炸的特點,所以,在實際應用中,帶有門限的RNN模型變種(Gated RNN)起著至關重要的作用,下面我們來進行介紹: LSTM (Long Short-term Memory )

機器學習深度學習系列連載 第二部分 深度學習(十三)迴圈神經網路 1(Recurre Neural Network 基本概念 )

迴圈神經網路 1(Recurre Neural Network 基本概念 ) 迴圈神經網路的特點: • RNNs 在每個時間點連線引數值,引數只有一份 • 神經網路出了輸入以外,還會建立在以前的“記憶”的基礎上 • 記憶體的要求與輸入的規模有關 當然,他的深度不只有一層:

機器學習深度學習系列連載 第二部分 深度學習(十二)卷積神經網路 3 經典的模型(LeNet-5,AlexNet ,VGGNet,GoogLeNet,ResNet)

卷積神經網路 3 經典的模型 經典的卷積神經網路模型是我們學習CNN的利器,不光是學習原理、架構、而且經典模型的超引數、引數,都是我們做遷移學習最好的源材料之一。 1. LeNet-5 [LeCun et al., 1998] 我們還是從CNN之父,LeCun大神在98年提出的模

機器學習深度學習系列連載 第二部分 深度學習(十一)卷積神經網路 2 Why CNN for Image?

卷積神經網路 2 Why CNN 為什麼處理圖片要用CNN? 原因是: 一個神經元無法看到整張圖片 能夠聯絡到小的區域,並且引數更少 圖片壓縮畫素不改變圖片內容 1. CNN 的特點 卷積: 一些卷積核遠遠小於圖片大小; 同樣的pat

機器學習深度學習系列連載 第二部分 深度學習(十)卷積神經網路 1 Convolutional Neural Networks

卷積神經網路 Convolutional Neural Networks 卷積神經網路其實早在80年代,就被神經網路泰斗Lecun 提出[LeNet-5, LeCun 1980],但是由於當時的資料量、計算力等問題,沒有得到廣泛使用。 卷積神經網路的靈感來自50年代的諾貝爾生物學獎

天搞懂“深度學習”之四基於神經網路的分類

分類用於確定資料所歸屬的類別,而回歸是根據已知的資料進行推斷或估計某個未知量,比如根據年齡和教育水平進行收入預測分析。分類的典型應用是垃圾郵件過濾和字元識別。 雖然神經網路適用於分類和迴歸,但卻很少用於迴歸。這不是因為它的效能不好,而是因為大多數迴歸問題可以用更簡單的模型來解決。(迴歸問

機器學習深度學習系列連載 第二部分 深度學習(十四)迴圈神經網路 2(Gated RNN

迴圈神經網路 2(Gated RNN - LSTM ) simple RNN 具有梯度消失或者梯度爆炸的特點,所以,在實際應用中,帶有門限的RNN模型變種(Gated RNN)起著至關重要的作用,下面我們來進行介紹: LSTM (Long Short-term

MATLAB 深度學習編碼(含MATLAB)

本節將研究深度學習網路權值設計的重要思想之一:自編碼思想,在正式介紹之前先以一個簡單的介紹一篇,一層隱含層網路的自編碼學習問題。 那麼這種網路有什麼實際應用呢?自動編碼器(Autoencoder)是當前深度學習研究的熱點之一,有很多重要的應用領域,這裡僅舉一個有趣的例

深度學習系列Part2遷移學習和微調深度卷積神經網路

http://www.jiqizhixin.com/article/1465 本文是微軟資料科學家 Anusua Trivedi 所寫的《Deep Learning》系列文章的第二部分,是對遷移學習和微調深度卷積神經網路的介紹。機器之心此前也已經編譯了該系列的第一部分

機器學習深度學習系列連載 第二部分 深度學習深度學習技巧3(Deep learning tips- Early stopping and Regularization)

深度學習技巧3( Early stopping and Regularization) 本節我們一起探討 Early stopping and Regularization,這兩個技巧不是深度學習特有的方法,是機器學習通用的方法。 1. Early stopp

深度學習之卷積編碼

一、自編碼器 自編碼器(Autoencoder)是一種旨在將它們的輸入複製到的輸出的神經網路。他們通過將輸入壓縮成一種隱藏空間表示(latent-space representation),然後這種重構這種表示的輸出進行工作。這種網路由兩部分組成,如下圖: 編碼器:將輸入壓縮為潛在空間

機器學習深度學習系列連載 第二部分 深度學習(二)梯度下降

梯度下降 Gradient Decent 我們回憶深度學習“三板斧”, 選擇神經網路 定義神經網路的好壞 選擇最好的引數集合 其中步驟三,如何選擇神經網路的好壞呢? 梯度下降是目前,最有效的方法之一。 方法:我們舉兩個引數的例子

機器學習深度學習系列連載 第二部分 深度學習(九)Keras- “hello world” of deep learning

Keras Kearas 是深度學習小白程式碼入門的最佳工具之一。 如果想提升、練習程式碼能力,還是建議演算法徒手python實現。 複雜的深度神經網路專案還是推薦TensorFlow或者Pytorch Keras是一個高層神經網路API,Keras由純Pyt