zoukankan      html  css  js  c++  java
  • UFLDL接听教程练习(来自编码器和矢量编程疏)

    最近想在深入学习研究,开始看UFLDL(unsuprisedfeature learning and deep learning)教程了。特将课后习题答案放在这里,作为一个笔记。

    笔记:

    1:自编码算法是一个无监督学习算法。它通过学习hw,b(x) = x,因此最后的outputlayer单元数与inputlayer单元数量相等,而中间的hiddenlayer能够非常大。这是加个稀疏惩处项,就相当于使中间非常多结点的激励值为0。这样就是类似于PCA了。算法就是反向传播,这里不做介绍。能够看教程!

    2:可视化自编码器,习题中可视化的是W1,即须要学习的參数W1

    这个我不是非常理解,后来想了想,因为输入的是图像的一个个像素点,那么每个hidden layer a1 (2)= w11x1+w12*x2+w13*x3+…~~不太理解,接着学习后面的看。

     

    练习答案:

    1:稀疏自编码器

    Step1sampleIMAGES.m文件里获取生成训练集的代码,当中tictoc是用来记时用的。

    tic
    image_size=size(IMAGES);
    i=randi(image_size(1)-patchsize+1,1,numpatches);   %产生1*10000个随机数 范围在[1,image_size(1)-patchsize+1]之间
    j=randi(image_size(2)-patchsize+1,1,numpatches);
    k=randi(image_size(3),1,numpatches);              % 随机的选取图片 10000次
    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


    Step2sparseAutoencoderCost.m文件里完毕前向传播和后向传播等相关代码

    %1.forward propagation
    data_size=size(data);           % [64, 10000]
    active_value2=repmat(b1,1,data_size(2));    % 将b1扩展10000列 25*10000
    active_value3=repmat(b2,1,data_size(2));    % 将b2扩展10000列 64*10000
    active_value2=sigmoid(W1*data+active_value2);  %隐结点的值 矩阵表示全部的样本     25*10000 一列表示一个样本 hidden 
    active_value3=sigmoid(W2*active_value2+active_value3);   %输出结点的值 矩阵表示全部的样本  64*10000 一列表示一个样本 output
    %2.computing error term and cost
    ave_square=sum(sum((active_value3-data).^2)./2)/data_size(2);   %cost第一项  最小平方和
    weight_decay=lambda/2*(sum(sum(W1.^2))+sum(sum(W2.^2)));         %cost第二项   全部參数的平方和 贝叶斯学派
    
    p_real=sum(active_value2,2)./data_size(2);       % 稀疏惩处项中的预计p 为25维 
    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)));   %KL diversion
    cost=ave_square+weight_decay+sparsity;      % 终于的cost function
    
    delta3=(active_value3-data).*(active_value3).*(1-active_value3);      % 为error 是64*10000 矩阵表示全部的样本,每一列表示一个样本
    average_sparsity=repmat(sum(active_value2,2)./data_size(2),1,data_size(2));  %求error中的稀疏项
    default_sparsity=repmat(sparsityParam,hiddenSize,data_size(2));     %稀疏化參数
    sparsity_penalty=beta.*(-(default_sparsity./average_sparsity)+((1-default_sparsity)./(1-average_sparsity

    Step3梯度检验

    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的时候,要将相关梯度校验相关代码去掉,由于这部分代码比較耗时间。

     

    2:矢量化编程实现

    这个仅仅须要在以上的代码中略做改动就可以。

    Step1首先将參数设置为

    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       

    Step2将稀疏编码器中的step1获取训练集的方式换成以下代码:

    images = loadMNISTImages('train-images.idx3-ubyte');
    
    display_network(images(:,1:100)); % Show the first 100 images
    patches = images(:, randi(size(images,2), 1, 10000));

    这样就能够得到下面可视化的结果了:


    版权声明:本文博主原创文章,博客,未经同意不得转载。

  • 相关阅读:
    【Ansible】 各种模块
    【Python】 linecache模块读取文件
    【Ansible】 基于SSH的远程管理工具
    【Python】 更棒的Excel操作模块xlwings
    【Python】 docker-py 用Python调用Docker接口
    【Docker】 Swarm简单介绍
    【Docker】 积累
    【Bootstrap】 一些提示信息插件
    配置 -- php运行报Call to undefined function curl_init()的解决办法
    windows下svn钩子实现每次提交更新至web目录
  • 原文地址:https://www.cnblogs.com/lcchuguo/p/4831209.html
Copyright © 2011-2022 走看看