UFLDL教程練習(exercise)答案(1)


之前看過Andrew NG大神寫的UFLDL教程,覺得很不錯,不過一直比較懶,沒有動手做里面的練習,最近做了一下,感覺很有意思。下面是《稀疏自編碼器》矢量化編程實現》這兩節我自己實現的練習答案,不保證完全正確,不過結果和網站上面給出的基本一致。

  1. 稀疏自編碼器

    • step1

sampleIMAGES.m文件中完成生成訓練集的代碼,如下,tic和toc用來計時的:

tic
image_size=size(IMAGES);
i=randi(image_size(1)-patchsize+1,1,numpatches);
j=randi(image_size(2)-patchsize+1,1,numpatches);
k=randi(image_size(3),1,numpatches);
for num=1:numpatches
        patches(:,num)=reshape(IMAGES(i(num):i(num)+patchsize-1,j(num):j(num)+patchsize-1,k(num)),1,patchsize*patchsize);
end
toc
    • step2

sparseAutoencoderCost.m文件中完成前向傳播和后向傳播等相關代碼,如下:

%1.forward propagation
data_size=size(data);
active_value2=repmat(b1,1,data_size(2));
active_value3=repmat(b2,1,data_size(2));
active_value2=sigmoid(W1*data+active_value2);
active_value3=sigmoid(W2*active_value2+active_value3);
%2.computing error term and cost
ave_square=sum(sum((active_value3-data).^2)./2)/data_size(2);
weight_decay=lambda/2*(sum(sum(W1.^2))+sum(sum(W2.^2)));

p_real=sum(active_value2,2)./data_size(2);
p_para=repmat(sparsityParam,hiddenSize,1);
sparsity=beta.*sum(p_para.*log(p_para./p_real)+(1-p_para).*log((1-p_para)./(1-p_real)));
cost=ave_square+weight_decay+sparsity;

delta3=(active_value3-data).*(active_value3).*(1-active_value3);
average_sparsity=repmat(sum(active_value2,2)./data_size(2),1,data_size(2));
default_sparsity=repmat(sparsityParam,hiddenSize,data_size(2));
sparsity_penalty=beta.*(-(default_sparsity./average_sparsity)+((1-default_sparsity)./(1-average_sparsity)));
delta2=(W2'*delta3+sparsity_penalty).*((active_value2).*(1-active_value2));
%3.backword propagation
W2grad=delta3*active_value2'./data_size(2)+lambda.*W2;
W1grad=delta2*data'./data_size(2)+lambda.*W1;
b2grad=sum(delta3,2)./data_size(2);
b1grad=sum(delta2,2)./data_size(2);
    • step3

梯度檢查,在computeNumericalGradient.m文件中完成梯度檢查的相關代碼,如下:

EPSILON=0.0001;
for i=1:size(theta)
    theta_plus=theta;
    theta_minu=theta;
    theta_plus(i)=theta_plus(i)+EPSILON;
    theta_minu(i)=theta_minu(i)-EPSILON;
    numgrad(i)=(J(theta_plus)-J(theta_minu))/(2*EPSILON);
end
    • step4

訓練並且可視化你的神經網絡參數,只要執行train.m文件即可,過一陣就會看到結果,我個人覺得梯度檢查最費時,檢查無誤后可以把那部分注釋掉,實際上的訓練並不慢,主要是因為網絡的參數不算多,訓練集也不算大。效果圖如下,和網站上提供的結果還是很像的。需要注意的是,這個是加上了所有約束的結果,如果沒有加上權重衰減和稀疏性懲罰,得不到這種結果的。

  1. 矢量化編程實現

這一節的練習是教大家怎么在matlab里用矢量化編程代替低效率的for循環的,用了MNIST數據集,其實和上一節基本一樣,只是數據集變了而已,因為上一節我的代碼已經是運用矢量化編程的了。首先在train.m文件中把step0里面的各個參數調整成這樣:

visibleSize = 28*28;   % number of input units 
hiddenSize = 196;     % number of hidden units
sparsityParam = 0.1;   % desired average activation of the hidden units.
                     % (This was denoted by the Greek alphabet rho, which looks like a lower-case "p",
             %  in the lecture notes). 
lambda = 3e-3;     % weight decay parameter       
beta = 3;            % weight of sparsity penalty term    

然后把step1里面的寫成這樣:

images = loadMNISTImages('train-images.idx3-ubyte');
patches = images(:,1:10000);
% 
% patches = sampleIMAGES;

接下來一切不變,注意一定要把梯度檢查注釋掉,因為這次的數據集相對比較大,梯度檢查所以會很慢。訓練結束后會得到這種樣子的圖片:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM