• 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;

    接下来一切不变,注意一定要把梯度检查注释掉,因为这次的数据集相对比较大,梯度检查所以会很慢。训练结束后会得到这种样子的图片:

  • 相关阅读:
    ABP源码编译及部署
    nopCommerce源码本地部署、配置及语言包导入
    MongoDB查询转对象时出错 Element '_id' does not match any field or property of class
    找不到资产文件 project.assets.json
    Docker中运行.net core 验证码不显示
    css设置input不显示光标
    js中的==和===
    Navicat连接mysql(高级选项配置)
    js回调函数,检测这个值是否重复
    layer数据表格换行
  • 原文地址:https://www.cnblogs.com/hrlnw/p/3127162.html
Copyright © 2020-2023  润新知