UFLDL学习笔记1(Sparse Autoencoder)
2014-01-11 18:35
302 查看
最近在学习UFLDL Tutorial,这是一套关于无监督学习的教程。在此感觉Andrew Ng做的真的是非常认真。下面把我的代码贴出来,方便大家学习调试。所有代码已经过matlab调试通过。
Sparse Autoencoder练习
说实话这一节我调了好几天才弄出来。期间一度想放弃从网上找代码,但最后还是坚持下来了。在此建议大家自己写代码,我的代码仅作为参考。如果自己写收获会非常多。
一共有三个.m文件要自己写,它们是sampleIMAGES.m, sparseAutoencoderCost.m, computeNumericalGradient.m。写的时候有如下tips:
(1)先写sampleIMAGES.m,这个最容易。
(2)再写computeNumericalGradient.m,这个是用来检查算法的。
(3)然后再写sparseAutoencoderCost.m,这个极容易写错。要时刻用computeNumericlaGradient.m来检查保证两个导数是相同的。
(4)调试时可以把输入层,隐层单元数弄少一点,方便调,也快。
sampleIMAGES.m代码:
computeNumericalGradient.m代码:
最主要也是最难就是sparseAutoencoderCost.m代码了。这部分我用矩阵代替了所有的for,因此会比较晦涩难懂。
一共有10幅训练图片,其中几幅如图:
运行大概需要几分钟,结果为
左图:不加正则项。
中图:加正则项,不加稀疏约束。
右图:加正则项,加稀疏约束。
由此可见,只有右图加了正则项和稀疏约束后才能获得正确的结果。
Sparse Autoencoder练习
说实话这一节我调了好几天才弄出来。期间一度想放弃从网上找代码,但最后还是坚持下来了。在此建议大家自己写代码,我的代码仅作为参考。如果自己写收获会非常多。
一共有三个.m文件要自己写,它们是sampleIMAGES.m, sparseAutoencoderCost.m, computeNumericalGradient.m。写的时候有如下tips:
(1)先写sampleIMAGES.m,这个最容易。
(2)再写computeNumericalGradient.m,这个是用来检查算法的。
(3)然后再写sparseAutoencoderCost.m,这个极容易写错。要时刻用computeNumericlaGradient.m来检查保证两个导数是相同的。
(4)调试时可以把输入层,隐层单元数弄少一点,方便调,也快。
sampleIMAGES.m代码:
[a,b] = size(IMAGES(:,:,1)); %获得图片高度宽度 col = a / patchsize; row = b / patchsize; cnt = 1; for k = 1:10 %一共10张图片 for j1 = 1:col for i1 = 1:row tmpM = IMAGES((j1-1)*patchsize+1:j1*patchsize, (i1-1)*patchsize+1:i1*patchsize, k); %用小块图片填充矩阵 patches(:,cnt) = reshape(tmpM,[],1); cnt = cnt+1; end end end rand = randperm(cnt); %生成不重复的随机数 patches = patches(:,rand(1:numpatches)); %随机选择若干个小块
computeNumericalGradient.m代码:
L = length(theta); ep = 0.0001; EP = eye(L) * ep; for i1 = 1:L numgrad(i1) = (J(theta+EP(:,i1)) - J(theta-EP(:,i1))) / (2*ep); end
最主要也是最难就是sparseAutoencoderCost.m代码了。这部分我用矩阵代替了所有的for,因此会比较晦涩难懂。
[dim,sampleN] = size(data); X = data; O2 = W1*X + b1*ones(1,sampleN); A2 = sigmoid(O2); O3 = W2*A2 + b2*ones(1,sampleN); A3 = sigmoid(O3); tmpM = (A3-X).*(A3-X); p = sum(A2,2) / sampleN; q = sparsityParam; kl = KL(q,p); E = 0.5 * sum(tmpM(:)) / sampleN + 0.5 * lambda * (sum(sum(W1.*W1)) + sum(sum(W2.*W2))) + beta * sum(kl); cost = E; dEdO3 = (A3-X).*A3.*(1-A3); dEdO2 = (W2'*dEdO3 + beta*(-q./p + (1-q)./(1-p)) * ones(1,sampleN)) .* A2 .* (1-A2); W2grad = dEdO3*A2' / sampleN + lambda*W2; b2grad = sum(dEdO3,2) / sampleN; W1grad = dEdO2*X' / sampleN + lambda*W1; b1grad = sum(dEdO2,2) / sampleN;其中
function kl = KL(q, p) kl = q * log(q./p) + (1-q) * log((1-q)./(1-p)); end
一共有10幅训练图片,其中几幅如图:
运行大概需要几分钟,结果为
左图:不加正则项。
中图:加正则项,不加稀疏约束。
右图:加正则项,加稀疏约束。
由此可见,只有右图加了正则项和稀疏约束后才能获得正确的结果。
相关文章推荐
- MacOS安装记
- 完美解决delphi7 安装Ehlib4.1.4报错的办法
- 使用 database triggers 把表设置为只读
- 信号之信号集
- POI介绍及视频教程
- zabbix 邮件报警(基于sendmail)
- D - 最小公倍数
- oralce数据泵
- C - Rightmost Digit
- 分享一个Mac苹果电脑远程连接windows等的工具 CoRD: Simple RDP Remote Desktop
- 原版ubuntu中安装中文输入法
- 在简历里的“奖励”部分,列出你所获得的并与你的求职目标相关的荣誉
- Pushlet 使用记录
- 视频编码与封装方式详解
- SDK和ADT更新失败问题解决
- ASP.NET 高级程序员进阶之路——快捷键篇
- 【总结】关于彩虹表学习阶段性总结
- gcc源代码分析 gen_rtx()函数
- 音频编码汇总
- A - No Brainer解题报告