深度学习系列(五):一个简单深度学习工具箱

本节主要介绍一个深度学习的matlab版工具箱,

DeepLearnToolbox

该工具箱中的代码很简单,感觉比较适合用来学习算法。里面有常见的网络结构,包括深度网络(NN),稀疏自编码网络(SAE),CAE,深度信念网络(DBN)(基于玻尔兹曼RBM实现),卷积神经网络(CNN)等等。感谢该toolbox的作者。发现这个工具箱是在CSDN上另外一位博主的博客下发现的,该博主也很详细的介绍了该工具箱里面的大多数函数,

点击该博主博客

也感谢该博主。在此博主的基础上,我添加一些自己的见解,更主要的是后期介绍一些基于该工具箱的深度学习应用。

这里再Mark一下其他好的深度学习工具箱:

18个最热深度学习Github项目逐一介绍

好了,对于前面那个工具箱,可以先去看看上面那个博主的系列文章,如果看不懂,没关系,看完了再看看应用,慢慢就懂了,下面的部分内容我将参考上述博主,同时加入更加详细的解释以期达到更明了的目的。

依据目前已经介绍的内容,对于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。,然后网络权值随机初始化。

紧接着是nntrain了,关于这部分,前面说的那个博主介绍的很好,里面注释也多,可以去看看(看完回来哦):
http://blog.csdn.net/dark_scope/article/details/9421061

这里再说下这个函数整体:[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,神经网络,深度学习)