UFLDL练习(Sparse Autoencoder)

最近开始学习UFLDL,一个deep learning的教程

这个练习的地址:http://deeplearning.stanford.edu/wiki/index.php/Exercise:Sparse_Autoencoder

Sparse Autoencoder是用神经网络进行feature learning的一个算法,详细的就见教程,我只是贴贴代码

从早上十点多一直debug到下午四点多,问题多多,究其原因还是对算法理解不够深刻,虽然以前还写过一个nn

所以收获还是有的,理解算法嘛

最主要的部分就是sparseAutoencoderCost.m了

[python]  view plain  copy
  1. mm=size(data,2);  
  2.   
  3. z2=(W1*data)+repmat(b1,1,mm);  
  4. a2=sigmoid(z2);  
  5. z3=(W2*a2)+repmat(b2,1,mm);  
  6. a3=sigmoid(z3);  
  7.   
  8. rho=sum(a2,2)./mm;  
  9.   
  10. cost=1/2/mm*sum(sum((a3-data).^2))+lambda/2*(sum(sum(W1.^2))+sum(sum(W2.^2)))+beta*sum(kldiverge(rho,sparsityParam));  
  11.   
  12. for i=1:mm  
  13.  x=data(:,i);  
  14.  delta3=-(x-a3(:,i)).*sigmoidGradient(z3(:,i));  
  15.  delta2=(W2'*delta3+beta*(-sparsityParam./rho+(1-sparsityParam)./(1-rho))).*sigmoidGradient(z2(:,i));  
  16.  W1grad=W1grad+delta2*x';  
  17.  W2grad=W2grad+delta3*a2(:,i)';  
  18.  b1grad=b1grad+delta2;  
  19.  b2grad=b2grad+delta3;  
  20. end  
  21. b1grad=b1grad/mm;  
  22. b2grad=b2grad/mm;  
  23. W1grad=W1grad/mm+lambda*W1;  
  24. W2grad=W2grad/mm+lambda*W2;  

下面是完全vectorization后的代码:

[python]  view plain  copy
  1. mm=size(data,2);  
  2.   
  3. z2=(W1*data)+repmat(b1,1,mm);  
  4. a2=sigmoid(z2);  
  5. z3=(W2*a2)+repmat(b2,1,mm);  
  6. a3=sigmoid(z3);  
  7.   
  8. rho=sum(a2,2)./mm;  
  9.   
  10. cost=1/2/mm*sum(sum((a3-data).^2))+lambda/2*(sum(sum(W1.^2))+sum(sum(W2.^2)))+beta*sum(kldiverge(rho,sparsityParam));  
  11. sparityy=(-sparsityParam./rho+(1-sparsityParam)./(1-rho));  
  12.   
  13.  x=data();  
  14.  delta3=-(x-a3).*sigmoidGradient(z3);  
  15.  delta2=(W2'*delta3+repmat(beta*sparityy,1,mm)).*a2.*(1-a2);  
  16.  W1grad=W1grad+delta2*x';  
  17.  W2grad=W2grad+delta3*a2';  
  18.  b1grad=b1grad+sum(delta2,2);  
  19.  b2grad=b2grad+sum(delta3,2);  
  20.   
  21. b1grad=b1grad/mm;  
  22. b2grad=b2grad/mm;  
  23. W1grad=W1grad/mm+lambda*W1;  
  24. W2grad=W2grad/mm+lambda*W2;  


出错这么久的主要原因就是我按照文档给的步骤计算:


但实际上这个步骤计算的是J(W,b;x,y),是针对某个训练数据来的,即使你把所有的累积起来,并没有满足要求

因为真正的梯度计算式子是:


我们算的不过是求和符号的那一坨,还需要加入外面的部分

看起来不止我一个人犯了这样的错误,因为微博上一人帖的代码也有问题

训练结果:


嗯嗯,就这样了,话说matlab 2012挺好用的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值