MATLAB 深度学习:⼀般深度学习MATLAB 代码解析系列(五):⼀个简单深度学习⼯具箱原创
⾸先介绍下⼀般⽹络的建⽴模型,到在⼯具箱
DeepLearnToolbox\tests\test_example_NN.m ⽂件,这个测试函数是测试⼀般的⽹络模型,取前⼀段代码:使⽤到的是⼿写体数据库,该数据库已经集成到⼯具箱了,直接⽤就好,显⽰看⼀看该数据库的⼀部分,其⽬标就是通过训练该数据库达到识别的⽬的:
1load mnist_uint8;2train_x = double(train_x) / 255;3test_x  = double(test_x)  / 255;4train_y = double(train_y);5test_y  = double(test_y);6 7% normalize 8[train_x, mu, sigma] = zscore(train_x);9test_x = normalize(test_x, mu, sigma);10 11%% ex1 vanilla neural net 12rand('state',0)13nn = nnsetup([784 100 10]);14opts.numepochs =  1;  %  Number of full sweeps through data 15opts.batchsize = 100;  %  Take a mean gradient step over this many samples 16[nn, L] = nntrain(nn, train_x, train_y, opts);17[er, bad] = nntest(nn, test_x, test_y);18assert(er < 0.08, 'Too big error');
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
紧接着是对该数据库数据进⾏归⼀化等等预处理。nnsetup建⽴⼀个⽹络,⾥⾯会有许多参数初始化,同时在设置下opts.numepochs = 1; 该参数个⼈感觉就是将所有数据重复试验次数,设置1就是实验⼀次。opts.batchsize = 100;该参数是将⼤量样本每随机100个作为⼀波送进去实验。再就是训练测试了。Ok来看看nnsetup:
这个函数理解起来很简单,初始化⽹络,⽹络需要什么初始化什么,⼀⼤堆初始化是适应所有的⽹络的(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 的具体实现细节见上⾯那个博客的介绍吧。
nntrain
setup ⼤概就这样⼀个过程,下⾯就到了train 了,打开\NN\nntrain.m
我们跳过那些检验传⼊数据是否正确的代码,直接到关键的部分
denoising 的部分请参考论⽂:Extracting and Composing Robust Features with Denoising Autoencoders
1function nn = nnsetup(architecture)2%NNSETUP 创建前向神经⽹络3% nn = nnsetup(architecture) 返回⼀个神经⽹络结构,architecture 为结构参数4% architecture 是⼀个n x 1 向量,表⽰每⼀层神经元的个数5%⽐如architecture=[784 100 10],表⽰输⼊层为784维输⼊,100个隐含层,10个输出层6%为什么是输⼊为784:因为每⼀个⼿写体⼤⼩为28*28的,也就是784维度7%隐含层为什么是100:随便设置的,可以随意修改,需要设计8%输出为什么是10:⼿写体有0-9这10种结果,所以为109 10    nn.size  = architecture;11    nn.n      = numel(nn.size);12 13    nn.activation_function              = 'tanh_opt';  % 隐含层激活函数: 'sigm' (sigmoid) or 'tanh_opt' (默认 tanh).14    nn.learningRate                    = 2;            %  学习率: typically needs to be lower when using 'sigm' activation function and non-normalized i
15    nn.momentum                        = 0.5;          %  Momentum 权值动量因⼦16    nn.scaling_learningRate            = 1;            %  学习率变化因⼦ (each epoch)17    nn.weightPenaltyL2                  = 0;            %  L2 regularization 正则化18    nn.nonSparsityPenalty              = 0;            %  ⾮稀疏惩罚19    nn.sparsityTarget                  = 0.05;        %  稀疏⽬标值20    nn.inputZeroMaskedFraction          = 0;            %  ⾃动编码的去噪作⽤21    nn.dropoutFraction                  = 0;            %  Dropout level (o.edu/~hinton/absps/dropout.pdf)22    nn.testing                          = 0;            %  Internal variable. nntest sets this to one.23    nn.output         
                = 'sigm';      %  输出激活output unit 'sigm' (=logistic), 'softmax' and 'linear'24 25    for i = 2 : nn.n  26        % weights and weight momentum 27        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)));28        nn.vW{i - 1} = zeros(size(nn.W{i - 1}));29 30        % average activations (for use with sparsity)31        nn.p{i}    = zeros(1, nn.size(i));  32    end 33end 1
2
3
4
5
6
7
8
9
10
11
12
13
14matlab学好了有什么用
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
下⾯分析三个函数nnff,nnbp和nnapplygrads
nnff
nnff就是进⾏feedforward pass,其实⾮常简单,就是整个⽹络正向跑⼀次就可以了当然其中有dropout和sparsity的计算
具体的参见论⽂“Improving Neural Networks with Dropout“和
1. function nn = nnff(nn, x, y)
2. //NNFF performs a feedforward pass
3. // nn = nnff(nn, x, y) returns an neural network structure with updated
4. // layer activations, error and loss (nn.a, nn.e and nn.L)
5.
6.    n = nn.n;
7.    m = size(x, 1);
8.
9.    x = [ones(m,1) x];
10.    nn.a{1} = x;
11.
12. //feedforward pass
13. for i = 2 : n-1
14. //根据选择的激活函数不同进⾏正向传播计算
15. //你可以回过头去看nnsetup⾥⾯的第⼀个参数activation_function
16. //sigm就是sigmoid函数,tanh_opt就是tanh的函数,这个toolbox好像有⼀点改变
17. //tanh_opt是1.7159*tanh(2/3.*A)
18. switch nn.activation_function
19. case'sigm'
20. // Calculate the unit's outputs (including the bias term)
21.                nn.a{i} = sigm(nn.a{i - 1} * nn.W{i - 1}');
22. case'tanh_opt'
23.                nn.a{i} = tanh_opt(nn.a{i - 1} * nn.W{i - 1}');
24.        end
25.
26. //dropout的计算部分部分 dropoutFraction 是nnsetup中可以设置的⼀个参数
27. if(nn.dropoutFraction > 0)
28. sting)
29.                nn.a{i} = nn.a{i}.*(1 - nn.dropoutFraction);
30. else
31.                nn.dropOutMask{i} = (rand(size(nn.a{i}))>nn.dropoutFraction);
32.                nn.a{i} = nn.a{i}.*nn.dropOutMask{i};
33.            end
34.        end
35. //计算sparsity,nonSparsityPenalty 是对没达到sparsitytarget的参数的惩罚系数
36. //calculate running exponential activations for use with sparsity
37. SparsityPenalty>0)
38.            nn.p{i} = 0.99 * nn.p{i} + 0.01 * mean(nn.a{i}, 1);
39.        end
40.
41. //Add the bias term
42.        nn.a{i} = [ones(m,1) nn.a{i}];
43.    end
44. switch nn.output
45. case'sigm'
46.            nn.a{n} = sigm(nn.a{n - 1} * nn.W{n - 1}');
47. case'linear'
48.            nn.a{n} = nn.a{n - 1} * nn.W{n - 1}';
49. case'softmax'
50.            nn.a{n} = nn.a{n - 1} * nn.W{n - 1}';//这⾥的n就是循环n-1⾥时那个具体的数,代表最后⼀
层输出层(不参与循环)
51.            nn.a{n} = exp(bsxfun(@minus, nn.a{n}, max(nn.a{n},[],2)));
52. //max这种表达的意思⽐较并取每⼀⾏的最⼤值,结果为列向量。
53.            nn.a{n} = bsxfun(@rdivide, nn.a{n}, sum(nn.a{n}, 2));
54.      // bsxfun代表⾼效运算,指两个数组间元素逐个计算的⼆值操作,@rdivide 这⾥指左
除;@minus是减法
55.    end
56. //error and loss
57.
58. //计算error
59.    nn.e = y - nn.a{n};
60. //计算计算loss 函数
61. switch nn.output
62. case {'sigm', 'linear'}
63.            nn.L = 1/2 * sum(sum(nn.e .^ 2)) / m;
64. case'softmax'
65.            nn.L = -sum(sum(y .* log(nn.a{n}))) / m;
66.    end
67. end
nnbp

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。