UFLDL接听教程练习(来自编码器和矢量编程疏)

时间:2022-09-01 07:29:57

最近想在深入学习研究,开始看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:稀疏自编码器

Step1:在sampleIMAGES.m文件里获取生成训练集的代码,当中tic和toc是用来记时用的。

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

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

UFLDL接听教程练习(来自编码器和矢量编程疏)

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

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

UFLDL接听教程练习(来自编码器和矢量编程疏)

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

UFLDL接听教程练习(来自编码器和矢量编程疏)的更多相关文章

  1. 矢量编程——随着MNIST案例

    矢量编程使用的所有明确的矢量运算,而不是for周期. 上一节所用的是512*512*10的数据集非常小.我们取的patch非常小(8*8),学来的特征非常少(25).而我又凝视掉了梯度校验(偷懒),所 ...

  2. Java NIO系列教程(八)JDK AIO编程

    目录: Reactor(反应堆)和Proactor(前摄器) <I/O模型之三:两种高性能 I/O 设计模式 Reactor 和 Proactor> <[转]第8章 前摄器(Proa ...

  3. 来自Unix&sol;Linux的编程启发录

    本篇文章已授权微信公众号 guolin_blog (郭霖)独家公布重点内容 2017年第一篇文章,祝各位好友新年快乐. 年前因为不小心坐到了自己左手大拇指导致轻微的骨裂,没有按时更新,实在是羞愧.今年 ...

  4. MinGW安装图文教程以及如何配置C语音编程环境

    MinGW安装图文教程以及如何配置C语音编程环境 转载自:http://www.jb51.net/softjc/192017.html MinGW 是一组包含文件和端口库,其功能是允许控制台模式的程序 ...

  5. UFLDL新版教程

    http://ufldl.stanford.edu/tutorial/ 还带编程作业.

  6. 转&plus;更新 Graphviz 教程&comma;例子&plus; 高级应用 写代码&comma;编程绘制架构图&lpar;分层拓扑图&rpar; 转自官网

    1. Graphviz介绍 Graphviz是大名鼎鼎的贝尔实验室的几位牛人开发的一个画图工具. 它的理念和一般的“所见即所得”的画图工具不一样,是“所想即所得”. Graphviz提供了dot语言来 ...

  7. 《C&num;并行编程高级教程》第9章 异步编程模型 笔记

    这个章节我个人感觉意义不大,使用现有的APM(异步编程模型)和EAP(基于时间的异步模型)就很够用了,针对WPF和WinForm其实还有一些专门用于UI更新的类. 但是出于完整性,还是将一下怎么使用. ...

  8. 《C&num;并行编程高级教程》第2章 命令式编程 笔记

    Parallel.Invoke 并行执行多个方法,只有在所有方法都执行后才会返回 static void Main(string[] args){    Parallel.Invoke(    () ...

  9. 一些matlab教程资源收藏,使用matlab编程的人还是挺多的

    Matlab教程专题资源免费下载整理合集收藏 <MATLAB从入门到精通>高清文字版[PDF] 103.9MB 简体中文 <矩阵实验室>(Mathworks.Matlab.R2 ...

随机推荐

  1. 剑指Offer 合并两个排序的链表

    题目描述 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则.   思路: 用2个新节点,一个用来存放新链表的头节点,另一个用来移动.当p1,p2有一个到尾部的 ...

  2. 利用freemarker生成xml

    package com.mooc.freemarkerXML; import java.io.IOException; import java.io.StringWriter; import java ...

  3. 使用C&num;选择文件夹、打开文件夹、选择文件

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...

  4. 跨域使用jsonp 获取天气预报

    <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server">    ...

  5. 简单学C——第七天

    函数 函数是C语言重要的组成部分,你现在,或者以后(如果C没什么变化的话)所写的任何一个C语言程序都是由一个一个的函数组合在一起的,当然,现在或许你只会在主函数 main中写一个小程序,那么在看了本篇 ...

  6. iWeb峰会见闻

    8.16去参加了iWeb峰会,一大早8点过10分就到了,发现外面已经排起了长队(说明影响力越来越大,关注的人越来越多了.) 此次大会参与的企业也越来越多,当然是有目的而来~ 上午 google商业合作 ...

  7. Intellij IDEA 像eclipse那样给maven添加依赖

    打开pom.xml,在它里面使用快捷键:ALT+Insert  ---->点击dependency 再输入想要添加的依赖关键字,比如:输个spring   出现下图: 根据需求选择版本,完成以后 ...

  8. vue-cli脚手架搭建项目简单入门一

    搭建系统: Windows系统 简单了解Node.js.npm,安装Node.js,下载网址:http://nodejs.cn/download/ 查看node,npm安装成功与否.打开cmd命令行, ...

  9. VMware环境安装MacOS

    环境: win10专业版 VMware 14 Pro 开始吧 1. 停止服务 2. 解压并管理员权限运行unlocker,目的是使得 win10 环境下的 VMWare14Pro 支持 mac 系统的 ...

  10. dedecms开启报错

    php.ini里面设置display_errors = On 开启错误提示,error_reporting = E_ALL & ~E_NOTICE 设置错误等级.也可以在php文件中ini_s ...