深度学习工具箱DeepLearnToolbox-master,DBN程序分析,

xiaoxiao2021-02-28  66

分析matlab里深度学习工具箱里的dbn的例子,对涉及到的函数进行简单注释分析,有助于程序理解,后续会应用在其他数据上进行注释。加了一些比较简单繁琐的注释。。。

以下函数为dbn例子,包括准备数据,设定dbn参数等

test_example_DBN调用了dbnsetup(构建DBN网络),dbntrain(训练DBN网络),dbnunfoldtonn(),nntrain,nntest。后面会逐个展示

%https://github.com/rasmusbergpalm/DeepLearnToolbox function test_example_DBN 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); %% ex1 train a 100 hidden unit RBM and visualize its weights %设定隐层单元数为100,而可视层单元数为输入向量的个数,由输入数据决定 rand('state',0) dbn.sizes = [100]; opts.numepochs = 1; %是计算时根据输出误差返回调整神经元权值和阀值的次数 %训练次数,用同样的样本集,别人训练的时候:1的时候11.41%error,5的时候4.2%error,10的时候2.73%error opts.batchsize = 100; %每次挑出一个batchsize的batch来训练,也就是每用batchsize个样本就调整一次权值,而不是把所有样本都输入了,计算所有样本的误差了才调整一次权值 opts.momentum = 0;%动量 opts.alpha = 1; %学习率 dbn = dbnsetup(dbn, train_x, opts); %构建DBN网络,并返回 dbn = dbntrain(dbn, train_x, opts); %给定训练样本,训练网络 figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights %% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NN rand('state',0) %train dbn dbn.sizes = [100 100]; opts.numepochs = 1; opts.batchsize = 100; opts.momentum = 0; opts.alpha = 1; dbn = dbnsetup(dbn, train_x, opts); dbn = dbntrain(dbn, train_x, opts); %unfold dbn to nn nn = dbnunfoldtonn(dbn, 10); 为输出层节点数 nn.activation_function = 'sigm'; %nnsetup底层里本身有激活函数的设定, %但这里根据具体应用进行了改变 %train nn opts.numepochs = 1; opts.batchsize = 100; %最后fine tuning就再训练一下NN就可以了 nn = nntrain(nn, train_x, train_y, opts); %用测试样本测试 [er, bad] = nntest(nn, test_x, test_y); assert(er < 0.10, 'Too big error'); dbnsetup.m,主要给每个rbm赋初始值,没有调用其他函数 function dbn = dbnsetup(dbn, x, opts) %构建dbn n = size(x, 2); %列的个数代表维度,也即输入特征的数量,即可视层单元个数 dbn.sizes = [n, dbn.sizes]; %分别为可视层大小和隐层大小 %numel(A)返回数组A中元素个数 for u = 1 : numel(dbn.sizes) - 1 %看有几个rbm?此时dbn.sizes=[784,100],numel(...)=2,所以是一个rbm %总体来说,dbn.sizes里的元素结果应该是【第一个rbm的可视层单元数即rbm1.v,rbm1.h,rbm2.h,rbm3.h,...】, %总之后一个rbm可视层的单元数即上个个rbm隐含层的单元数,所以就省略不写了,所以整个rbm的个数也就确定了, %即number(dbn.sizes)-1,下面,分别为每个rbm赋参数 dbn.rbm{u}.alpha = opts.alpha; %学习率 dbn.rbm{u}.momentum = opts.momentum; %动量 dbn.rbm{u}.W = zeros(dbn.sizes(u + 1), dbn.sizes(u));%权重个数(隐层节点数,可视层节点数) dbn.rbm{u}.vW = zeros(dbn.sizes(u + 1), dbn.sizes(u));%(隐层节点数,可视层节点数) %偏置 dbn.rbm{u}.b = zeros(dbn.sizes(u), 1);%可视层偏置,与可视层节点数对应 dbn.rbm{u}.vb = zeros(dbn.sizes(u), 1); dbn.rbm{u}.c = zeros(dbn.sizes(u + 1), 1);%隐含层偏置,与隐含层节点数对应,dbn.sizes(u + 1)为隐含层节点数 dbn.rbm{u}.vc = zeros(dbn.sizes(u + 1), 1); end enddbntrain.m,训练dbn,对每个rbm进行训练,调用了rbmtrain和rbmup函数

function dbn = dbntrain(dbn, x, opts) n = numel(dbn.rbm); %看有几个rbm dbn.rbm{1} = rbmtrain(dbn.rbm{1}, x, opts); %先对第一个rbm进行训练 %第一个参数是rbm的结构信息,第二个是训练数据,第三个是rbm训练信息 for i = 2 : n x = rbmup(dbn.rbm{i - 1}, x);%实现rbm间的连接,数据传递,前一个rbm的输出数据为后一个rbm的输入数据 dbn.rbm{i} = rbmtrain(dbn.rbm{i}, x, opts); %接着训练新的rbm end end贴出被调用的两个函数

rbmtrain.m训练单个rbm,改变rbm参数,W,vW , c ,  vc , b , vb

function rbm = rbmtrain(rbm, x, opts) %对单个rbm进行训练 assert(isfloat(x), 'x must be a float'); assert(all(x(:)>=0) && all(x(:)<=1), 'all data in x must be in [0:1]'); m = size(x, 1); %样本数 numbatches = m / opts.batchsize;
转载请注明原文地址: https://www.6miu.com/read-79800.html

最新回复(0)