1. 程式人生 > >深度學習系列(五):一個簡單深度學習工具箱

深度學習系列(五):一個簡單深度學習工具箱

本節主要介紹一個深度學習的matlab版工具箱,

該工具箱中的程式碼很簡單,感覺比較適合用來學習演算法。裡面有常見的網路結構,包括深度網路(NN),稀疏自編碼網路(SAE),CAE,深度信念網路(DBN)(基於玻爾茲曼RBM實現),卷積神經網路(CNN)等等。感謝該toolbox的作者。發現這個工具箱是在CSDN上另外一位博主的部落格下發現的,該博主也很詳細的介紹了該工具箱裡面的大多數函式,

也感謝該博主。在此博主的基礎上,我新增一些自己的見解,更主要的是後期介紹一些基於該工具箱的深度學習應用。

這裡再Mark一下其他好的深度學習工具箱:

好了,對於前面那個工具箱,可以先去看看上面那個博主的系列文章,如果看不懂,沒關係,看完了再看看應用,慢慢就懂了,下面的部分內容我將參考上述博主,同時加入更加詳細的解釋以期達到更明瞭的目的。

依據目前已經介紹的內容,對於DBN,CNN等沒有介紹到的內容我將在後期討論介紹,這裡我先主要介紹下基於該工具箱的網路建立,以及稀釋自編碼網路。

首先介紹下一般網路的建立模型,找到在工具箱
DeepLearnToolbox\tests\test_example_NN.m檔案,這個測試函式是測試一般的網路模型,取前一段程式碼:

load mnist_uint8;
train_x = double(train_x) / 255;
test_x  = double(test_x)  / 255;
train_y = double(train_y);
test_y  = double(test_y);

% normalize
[train_x, mu, sigma] = zscore(train_x);
test_x = normalize(test_x, mu, sigma);

%% ex1 vanilla neural net
rand('state',0)
nn = nnsetup([784 100 10]);
opts.numepochs =  1;   %
Number of full sweeps through data opts.batchsize = 100; % Take a mean gradient step over this many samples [nn, L] = nntrain(nn, train_x, train_y, opts); [er, bad] = nntest(nn, test_x, test_y); assert(er < 0.08, 'Too big error');

使用到的是手寫體資料庫,該資料庫已經整合到工具箱了,直接用就好,顯示看一看該資料庫的一部分,其目標就是通過訓練該資料庫達到識別的目的:
這裡寫圖片描述

緊接著是對該資料庫資料進行歸一化等等預處理。nnsetup建立一個網路,裡面會有許多引數初始化,同時在設定下opts.numepochs = 1; 該引數個人感覺就是將所有資料重複試驗次數,設定1就是實驗一次。opts.batchsize = 100;該引數是將大量樣本每隨機100個作為一波送進去實驗。再就是訓練測試了。Ok來看看nnsetup:

function nn = nnsetup(architecture)
%NNSETUP建立前向神經網路
% nn = nnsetup(architecture) 返回一個神經網路結構,architecture為結構引數
% architecture 是一個n x 1 向量,表示每一層神經元的個數
%比如architecture=[784 100 10],表示輸入層為784維輸入,100個隱含層,10個輸出層
%為什麼是輸入為784:因為每一個手寫體大小為28*28的,也就是784維度
%隱含層為什麼是100:隨便設定的,可以隨意修改,需要設計
%輸出為什麼是10:手寫體有0-9這10種結果,所以為10

    nn.size   = architecture;
    nn.n      = numel(nn.size);

    nn.activation_function              = 'tanh_opt';   % 隱含層啟用函式: 'sigm' (sigmoid) or 'tanh_opt' (預設 tanh).
    nn.learningRate                     = 2;            %  學習率: typically needs to be lower when using 'sigm' activation function and non-normalized inputs.
    nn.momentum                         = 0.5;          %  Momentum 權值動量因子
    nn.scaling_learningRate             = 1;            %  學習率變化因子 (each epoch)
    nn.weightPenaltyL2                  = 0;            %  L2 regularization
    nn.nonSparsityPenalty               = 0;            %  非稀疏懲罰
    nn.sparsityTarget                   = 0.05;         %  稀疏目標值
    nn.inputZeroMaskedFraction          = 0;            %  自動編碼的去噪作用
    nn.dropoutFraction                  = 0;            %  Dropout level (http://www.cs.toronto.edu/~hinton/absps/dropout.pdf)
    nn.testing                          = 0;            %  Internal variable. nntest sets this to one.
    nn.output                           = 'sigm';       %  輸出啟用output unit 'sigm' (=logistic), 'softmax' and 'linear'

    for i = 2 : nn.n   
        % weights and weight momentum
        nn.W{i - 1} = (rand(nn.size(i), nn.size(i - 1)+1) - 0.5) * 2 * 4 * sqrt(6 / (nn.size(i) + nn.size(i - 1)));
        nn.vW{i - 1} = zeros(size(nn.W{i - 1}));

        % average activations (for use with sparsity)
        nn.p{i}     = zeros(1, nn.size(i));   
    end
end

這個函式理解起來很簡單,初始化網路,網路需要什麼初始化什麼,一大堆初始化是適應所有的網路的(cnn,dbn等等),有些用到了再說吧,現在你只需要知道網路的結構,以及與稀疏編碼表示有關的引數: nn.nonSparsityPenalty ,nn.sparsityTarget,這也就是上節說到的,為什麼稀疏表示具體怎麼樣不用管,實際使用的時候只是這麼幾個引數設定,其他的交給程式吧。再有就是注意下啟用函式 nn.activation_function。,然後網路權值隨機初始化。

這裡再說下這個函式整體:[nn, L] = nntrain(nn, train_x, train_y, opts);

可以看到nntrain需要的是設計的網路nn,訓練資料train_x,訓練對應的目標值train_y,以及附加引數opts。附加引數包括:重複訓練次數opts.numepochs,訓練資料每一塊大小opts.batchsize等等。函數出來的就是訓練好的網路nn,這個很重要,訓練好的nn為結構體,裡面包括你所需要的所有資訊,比如說每一層網路的權值係數,訓練誤差,等等都可以找到,並且在nntest也是用這個訓練好的nn。nntrain的具體實現細節上面那個部落格的介紹吧。

Ok再來看看nntest,如下:

function [ri, right] = nntest(nn, x, y)
    labels = nnpredict(nn, x);
    [~, expected] = max(y,[],2);
    right = find(labels == expected);    
    ri = numel(right) / size(x, 1);
end

呼叫一下nnpredict。函式需要的就是測試資料x和標籤y,如果有y的話那麼可以計算準確率,如果沒有y的話那麼你可以自己直接呼叫 labels = nnpredict(nn, x)可以得到預測的標籤。

Ok這就是一個簡單的一般化的神經網路了,和我們第三節的matlab自帶的神經網路工具箱實現的功能差不多。然而複雜的帶稀疏自編碼的深度學習網路,自帶的就不行了。下一節再來看看同過該工具箱建立稀疏自編碼的網路。

相關推薦

深度學習系列一個簡單深度學習工具箱

本節主要介紹一個深度學習的matlab版工具箱, 該工具箱中的程式碼很簡單,感覺比較適合用來學習演算法。裡面有常見的網路結構,包括深度網路(NN),稀疏自編碼網路(SAE),CAE,深度信念網路(DBN)(基於玻爾茲曼RBM實現),卷積神經網路(CNN

deeplearning系列實現一個簡單深度神經網路

1. 深度學習概覽 在淺層神經網路的介紹中,實現了包含一個隱藏層的淺層神經網路,對於這樣的淺層網路,在網路訓練過程中可以通過反向傳播演算法得到較優的網路引數值。然而,因為只有一個隱藏層,限制了模型的表達能力。 在本節中,開始介紹包含多個隱藏層的深度神經網路,

TensorFlow學習系列如何使用佇列和多執行緒優化輸入管道

這篇教程是翻譯Morgan寫的TensorFlow教程,作者已經授權翻譯,這是原文。 目錄 TensorFlow 1.0版本已經出來了,隨著這次更新,一些不錯的指導建議出現在官網上面。其中一個我比較關心的是 f

強化學習系列蒙特卡羅方法Monte Carlo)

一、前言 在強化學習系列(四):動態規劃中,我們介紹了採用DP (動態規劃)方法求解environment model 已知的MDP(馬爾科夫決策過程),那麼當environment model資訊不全的時候,我們會採用什麼樣的方法求解呢?蒙特卡洛方法(Mon

QML學習筆記— 做一個簡單的待做事項列表

checked amp click done itl listview blank row idt 做一個簡單的QML待做事項列表,能夠動態添加和刪除和編輯數據 GitHub:八至 作者:狐貍家的魚 本文鏈接:QML學習筆記(五)— 做一個待做事項列表

深度學習方法卷積神經網路CNN經典模型整理Lenet,Alexnet,Googlenet,VGG,Deep Residual Learning

歡迎轉載,轉載請註明:本文出自Bin的專欄blog.csdn.net/xbinworld。  技術交流QQ群:433250724,歡迎對演算法、技術感興趣的同學加入。 關於卷積神經網路CNN,網路和文獻中有非常多的資料,我在工作/研究中也用了好一段時間各種常見的model了,就想著

深度學習框架Keras學習系列線性代數基礎與numpy使用Linear Algebra Basis and Numpy

又開一個新坑~~ 因為確實很有必要好好地趁著這個熱潮來研究一下深度學習,畢竟現在深度學習因為其效果突出,熱潮保持高漲不退,上面的政策方面現在也在向人工智慧領域傾斜,但是也有無數一知半解的人跟風吹捧,於是希望藉此教程,讓自己和讀者一起藉助keras,從上到下逐漸

各種音視訊編解碼學習詳解之 編解碼學習筆記Mpeg系列——AAC音訊

     最近在研究音視訊編解碼這一塊兒,看到@bitbit大神寫的【各種音視訊編解碼學習詳解】這篇文章,非常感謝,佩服的五體投地。奈何大神這邊文章太長,在這裡我把它分解成很多小的篇幅,方便閱讀。大神部落格傳送門:https://www.cnblogs.com/skyo

機器學習實戰系列SVM支援向量機

課程的所有資料和程式碼在我的Github:Machine learning in Action,目前剛開始做,有不對的歡迎指正,也歡迎大家star。除了 版本差異,程式碼裡的部分函式以及程式碼正規化也和原書不一樣(因為作者的程式碼實在讓人看的彆扭,我改過後看起來舒服多了)

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

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

周志華《機器學習》課後習題解答系列Ch4

本章概要 本章講述決策樹(decision tree),相關內容包括: 決策樹生成(construction) 子決策(sub-decision)、遞迴生成演算法(basic algorithm)、最優劃分屬性、純度(purity)、

深度學習系列簡單網路的自編碼學習

本節將研究深度學習網路權值設計的重要思想之一:自編碼思想,在正式介紹之前先以一個簡單的介紹一篇,一層隱含層網路的自編碼學習問題。 什麼是自編碼?所謂自編碼就是自己給自己編碼,再簡單點就是令輸出等於輸入自己。以一個簡單三層網路為例如下: 這裡我們假設輸出等

【開源】OSharp框架學習系列1總體設計及系列導航

正是 html 組織 內聚性 權限 是什麽 enc 3-0 分發 OSharp是什麽?   OSharp是個快速開發框架,但不是一個大而全的包羅萬象的框架,嚴格的說,OSharp中什麽都沒有實現。與其他大而全的框架最大的不同點,就是OSharp只做抽象封裝,不做實現。依賴註

javascript學習筆記異常捕獲和事件處理

log 類型 按鈕 輸入 button lan yellow logs 代碼 異常捕獲 Try{   發生異常的代碼塊 }catch(err){   異常信息處理 } 1 <!DOCTYPE html> 2 <html> 3 <head

Unity3D之Mecanim動畫系統學習筆記Animator Controller

浮點 key 發現 菜單 融合 stat mon 好的 project 簡介 Animator Controller在Unity中是作為一種單獨的配置文件存在的文件類型,其後綴為controller,Animator Controller包含了以下幾種功能: 可以對

Scala入門系列面向對象之類

important ica back ember const 就會 out 不用 spa // 定義類,包含field以及method class HelloWorld { private var name = "Leo" def sayHello() { prin

Docker學習系列windows下安裝docker

阻止 statistic pro nta 雙擊 copyright ner notebook 現在 本文目錄如下: windows按照docker的基本要求 具體安裝步驟 開始使用 安裝遠程連接工具連接docker 安裝中遇到的問題 Docker的更新 Dock

Servlet一個Servlet處理多個請求

catch onu servlet容器 -name 浪費 根據 head 重復 vat 一、為什麽要使用一個Servlet來處理多個請求? 當瀏覽器發送了一次請求到服務器時,servlet容器會根據請求的url-pattern找到對應的Servlet類,執行對應的doPos

hadoop學習筆記HBase體系結構和數據模型

ems 服務器端 們的 code 修改 保存 重新 table lpad 1. HBase體系結構 一個完整分布式的HBase的組成示意圖如下,後面我們再詳細談其工作原理。 1)Client 包含訪問HBase的接口並維護cache來加快對HBase的訪問。 2)Zooke

eShopOnContainers學習系列數據庫連接健康檢查

技術分享 負載 star bsp 方法 containe 需要 正常 連接 項目裏使用數據庫的時候,我們有時候需要知道數據庫當前的健康狀態,特別是當數據庫連接不上的時候能夠立馬獲悉。eShopOnContainers裏存在著大量的服務健康、連接健康的檢查,數據庫連接是其中之