UFLDL学习笔记1(Sparse Autoencoder)

最近在学习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代码:

[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幅训练图片,其中几幅如图:



运行大概需要几分钟,结果为

左图:不加正则项。

中图:加正则项,不加稀疏约束。

右图:加正则项,加稀疏约束。


由此可见,只有右图加了正则项和稀疏约束后才能获得正确的结果。

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值