Exercise: Implement deep networks for digit classification 代码示例

Exercise: Implement deep networks for digit classification 代码示例

练习参考Implement deep networks for digit classification

 

       这个练习用到了一个四层的深度神经网络。第一层是数据输入层;第二、三层是稀疏自编码器层,分别取两个稀疏自编码器的隐藏层作为第二、三层;第四层为Softmax分类器,用于分类0到9的手写数字。在训练Softmax分类器后,又对整个网络进行了微调。在微调时,需要把L2~L4这三层作为一个模型进行调整,调用一次minFunc函数,得到调整后的三层的参数值。经测试,发现微调后在测试数据上的准确率有大幅度提高。

 

       微调时需要利用反向传播算法计算三层的梯度值:

STEP 2: Train the first sparse autoencoder

 

[plain] view plaincopy
 
  1. addpath minFunc/  
  2. options.Method = 'lbfgs';   
  3. options.maxIter = 400;  
  4. options.display = 'on';  
  5.   
  6. [sae1OptTheta, cost] = minFunc( @(p) sparseAutoencoderCost(p, ...  
  7.                                    inputSize, hiddenSizeL1, ...  
  8.                                    lambda, sparsityParam, ...  
  9.                                    beta, trainData), ...  
  10.                               sae1Theta, options);  


STEP 2: Train the second sparse autoencoder

 

 

[plain] view plaincopy
 
  1. [sae2OptTheta, cost] = minFunc( @(p) sparseAutoencoderCost(p, ...  
  2.                                    hiddenSizeL1, hiddenSizeL2, ...  
  3.                                    lambda, sparsityParam, ...  
  4.                                    beta, sae1Features), ...  
  5.                               sae2Theta, options);  


STEP 3: Train the softmax classifier

 

 

[plain] view plaincopy
 
  1. options.maxIter = 100;  
  2. softmaxModel = softmaxTrain(hiddenSizeL2, numClasses, lambda, ...  
  3.                             sae2Features, trainLabels, options);  
  4. saeSoftmaxOptTheta = softmaxModel.optTheta(:);  

 

Step 4: Implement fine-tuning

stackedAECost.m

 

[plain] view plaincopy
 
  1. stack{1}.i = data;  
  2. for d = 1:numel(stack)-1  
  3.     stack{d}.o = sigmoid(stack{d}.w * stack{d}.i + repmat(stack{d}.b,1,M));  
  4.     stack{d+1}.i = stack{d}.o;  
  5. end  
  6. stack{end}.o = sigmoid(stack{end}.w * stack{end}.i + repmat(stack{end}.b,1,M));  
  7.   
  8. Mat = softmaxTheta * stack{end}.o;  
  9. Mat = exp(bsxfun(@minus, Mat, max(Mat, [], 1)));  
  10. P = bsxfun(@rdivide, Mat, sum(Mat));  
  11. Mat = log(P);  
  12. WD = lambda / 2 * sum(sum(softmaxTheta.^2));   
  13. cost = -sum(sum(groundTruth.*Mat)) / M + WD;  
  14. softmaxThetaGrad = -(groundTruth - P) * stack{end}.o' ./ M + lambda.*softmaxTheta;  
  15.   
  16. stack{end}.delta = -softmaxTheta' * (groundTruth - P) .* stack{end}.o .* (1 - stack{end}.o);  
  17. for d = numel(stack)-1:-1:1  
  18.     stack{d}.delta = stack{d+1}.w' * stack{d+1}.delta .* stack{d}.o .* (1 - stack{d}.o);  
  19. end  
  20.   
  21. for d = 1:numel(stack)  
  22.     stackgrad{d}.w = stack{d}.delta * stack{d}.i' / M;  
  23.     stackgrad{d}.b = mean(stack{d}.delta,2);  
  24. end  


STEP 5: Finetune softmax model

 

 

[plain] view plaincopy
 
  1. options.Method = 'lbfgs';    
  2. options.maxIter = 400;    
  3. options.display = 'on';    
  4. [stackedAEOptTheta, cost] = minFunc( @(p) stackedAECost(p, inputSize, hiddenSizeL2, ...    
  5.                                               numClasses, netconfig, ...    
  6.                                               lambda, trainData, trainLabels), ...                                       
  7.                               stackedAETheta, options);    

STEP 6: Test 
stackedAEPredict.m

 

 

[plain] view plaincopy
 
    1. M = size(data, 2);  
    2. stack{1}.i = data;  
    3. for d = 1:numel(stack)-1  
    4.     stack{d}.o = sigmoid(stack{d}.w * stack{d}.i + repmat(stack{d}.b,1,M));  
    5.     stack{d+1}.i = stack{d}.o;  
    6. end  
    7. stack{end}.o = sigmoid(stack{end}.w * stack{end}.i + repmat(stack{end}.b,1,M));  
    8. Mat = softmaxTheta * stack{end}.o;  
    9. [~,pred] = max(Mat);  
posted @ 2015-11-17 10:53  菜鸡一枚  阅读(188)  评论(0)    收藏  举报