Exercise:Sparse Autoencoder 代码示例

练习参考Sparse Autoencoder


第一步,生成训练数据。在sampleIMAGES.m文件中加入如下代码:

size3D=size(IMAGES);
for i=1:numpatches
    x=randi(size3D(1)-patchsize+1);
    y=randi(size3D(2)-patchsize+1);
    patches(:,i)=reshape(IMAGES(x:x+patchsize-1,y:y+patchsize-1,randi(size3D(3))),patchsize*patchsize,1);
end
在train.m文件中注释掉STEP 2到STEP 5的代码,运行train.m查看效果。


第二步,检查梯度。在computeNumericalGradient.m文件中加入如下代码:
EPSILON=0.0001;
n=size(theta);
for i=1:n
    theta1=theta;
    theta2=theta;
    theta1(i)=theta1(i)+EPSILON;
    theta2(i)=theta2(i)-EPSILON;
    numgrad(i)=(J(theta1)-J(theta2))/(2*EPSILON);
end
在train.m文件中注释掉STEP 2到STEP 5的代码,调用checkNumericalGradient(),检查梯度计算是否正确。


第三步,计算稀疏自编码器的损失和梯度。梯度利用反向传导算法计算。在sparseAutoencoderCost.m文件中加入如下代码:
m=size(data,2);
a2=sigmoid(bsxfun(@plus,W1*data,b1));
a3=sigmoid(bsxfun(@plus,W2*a2,b2));
squared_error=sum(sum((a3-data).^2))/(2*m);
weight_decay=lambda/2*(sum(sum(W1.^2))+sum(sum(W2.^2)));
pj=mean(a2,2);
sparsity_penalty=sparsityParam.*log(sparsityParam./pj)+(1-sparsityParam).*log((1-sparsityParam)./(1.-pj));

d3=(a3-data).*(a3.*(1-a3));  
d2=(W2'*d3+beta.*repmat((-sparsityParam./pj+(1-sparsityParam)./(1.-pj)),1,size(data,2))).*(a2.*(1-a2));

W2grad=d3*a2'./m+lambda*W2;
b2grad=sum(d3,2)./m;
W1grad=d2*data'./m+lambda*W1;
b1grad=sum(d2,2)./m;
cost=squared_error+weight_decay+beta*sum(sparsity_penalty);
在train.m文件中注释掉STEP 4到STEP 5的代码,运行STEP 3中的梯度检验代码,检验梯度计算是否正确。


第四步,训练稀疏自编码器。梯度计算正确的话,便可进行训练。在train.m文件中注释掉STEP 3的代码,运行STEP 4,STEP 5。最后会出现可视化训练结果。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值