UFLDL学习笔记6(Linear Decoders with Autoencoders)

UFLDL学习笔记6(Linear Decoders with Autoencoders)

最近在学习UFLDL Tutorial,这是一套关于无监督学习的教程。在此感觉Andrew Ng做的真的是非常认真。下面把我的代码贴出来,方便大家学习调试。所有代码已经过matlab调试通过。

 

Linear Decoders with Autoencoders

这一章是第一章Sparse Autoencoder变化版。第一章的Sparse Autoencoder两层都用的是sigmoid映射,那么输出一定在0-1之间,因此数据在输入之前必须规整到0-1之间。本章的Sparse Autoencoder第二层不用sigmoid,直接输出,因此叫做Linear Decoder,可以获得任意范围的值。本章用的数据是彩色的,因此输入结点数*3。代码编写十分简单。

 

代码编写

sparseAutoencoderLinearCost.m 获得损失函数及权值梯度。只需要把第一章中的sparseAutoencoderCost.m拷过来稍加改动即可。在此把整个.m的代码贴出来。代码:

 

[plain] view plaincopy
 
  1. function [cost,grad,features] = sparseAutoencoderLinearCost(theta, visibleSize, hiddenSize, ...  
  2.                                                             lambda, sparsityParam, beta, data)  
  3. % -------------------- YOUR CODE HERE --------------------  
  4. % 该代码拷贝自sparseAutoencoderLinearCost.m,只修改了A3和dEdO3两行,其它不动。  
  5.   
  6. % 初始化  
  7. W1 = reshape(theta(1:hiddenSize*visibleSize), hiddenSize, visibleSize);  
  8. W2 = reshape(theta(hiddenSize*visibleSize+1:2*hiddenSize*visibleSize), visibleSize, hiddenSize);  
  9. b1 = theta(2*hiddenSize*visibleSize+1:2*hiddenSize*visibleSize+hiddenSize);  
  10. b2 = theta(2*hiddenSize*visibleSize+hiddenSize+1:end);  
  11.   
  12. cost = 0;  
  13. W1grad = zeros(size(W1));   
  14. W2grad = zeros(size(W2));  
  15. b1grad = zeros(size(b1));   
  16. b2grad = zeros(size(b2));  
  17.   
  18. % 获得每层输出  
  19. [dim,sampleN] = size(data);  
  20. X = data;  
  21. O2 = W1*X + b1*ones(1,sampleN);  
  22. A2 = sigmoid(O2);  
  23. O3 = W2*A2 + b2*ones(1,sampleN);  
  24. A3 = O3;  
  25. tmpM = (A3-X).*(A3-X);  
  26.   
  27. % 稀疏代价  
  28. p = sum(A2,2) / sampleN;  
  29. q = sparsityParam;  
  30. kl = KL(q,p);  
  31.   
  32. % 损失函数  
  33. E = 0.5 * sum(tmpM(:)) / sampleN + 0.5 * lambda * (sum(sum(W1.*W1)) + sum(sum(W2.*W2))) + beta * sum(kl);  
  34. cost = E;  
  35.   
  36. % 获得权值梯度  
  37. dEdO3 = (A3-X);  
  38. dEdO2 = (W2'*dEdO3 + beta*(-q./p + (1-q)./(1-p)) * ones(1,sampleN)) .* A2 .* (1-A2);  
  39.   
  40. W2grad = dEdO3*A2' / sampleN + lambda*W2;  
  41. b2grad = sum(dEdO3,2) / sampleN;  
  42. W1grad = dEdO2*X' / sampleN + lambda*W1;  
  43. b1grad = sum(dEdO2,2) / sampleN;  
  44.   
  45. % 格式化输出  
  46. grad = [W1grad(:) ; W2grad(:) ; b1grad(:) ; b2grad(:)];                                  
  47.   
  48. end  
  49.   
  50. function sigm = sigmoid(x)  
  51.     sigm = 1 ./ (1 + exp(-x));  
  52. end  
  53.   
  54. function kl = KL(q, p)  
  55.     kl = q * log(q./p) + (1-q) * log((1-q)./(1-p));  
  56. end  
  57.   
  58. % -------------------- YOUR CODE HERE --------------------      


运行结果

 

 

小结

同样发现Linear Decoders with Autoencoders提取了图像的边缘。本章相对比较容易。

posted @ 2015-11-18 14:30  菜鸡一枚  阅读(132)  评论(0)    收藏  举报