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:稀疏自编码器

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

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

这样就可以得到以下可视化的结果了:

时间: 2024-10-27 10:29:27

UFLDL教程练习答案一(稀疏自编码器和矢量化编程实现)的相关文章

稀疏自编码器和矢量化编程

相关的公式 证明参考PPT: http://wenku.baidu.com/link?url=dBZZq7TYJOnIw2mwilKsJT_swT52I0OoikmvmgBaYE_NvP_KChFZ-HOURH5LMiLEuSVFcGmJ0bQfkG-ZYk-IRJf7D-w6P9PBec8EZ9IxgFS Python实现代码参考 @author: Paul Rothnieemail : [email protected]https://github.com/siddharth950/Spar

UFLDL教程(一)--稀疏自编码器

神经网络模型 简单的神经网络 前向传播 代价函数 对于单个样例 ,其代价函数为: 给定一个包含m个样例的数据集,我们可以定义整体代价函数为: 以上公式中的第一项  是一个均方差项.第二项是一个规则化项(也叫权重衰减项),其目的是减小权重的幅度,防止过度拟合. 反向传播算法 反向传播算法,它是计算偏导数的一种有效方法. 批量梯度下降法 版权声明:本文为博主原创文章,未经博主允许不得转载.

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

最近想在深入学习研究,开始看UFLDL(unsuprisedfeature learning and deep learning)教程了.特将课后习题答案放在这里,作为一个笔记. 笔记: 1:自编码算法是一个无监督学习算法.它通过学习hw,b(x) = x,因此最后的outputlayer单元数与inputlayer单元数量相等,而中间的hiddenlayer能够非常大.这是加个稀疏惩处项,就相当于使中间非常多结点的激励值为0.这样就是类似于PCA了.算法就是反向传播,这里不做介绍.能够看教程!

稀疏自编码器及事实上现——怎样搞基

自编码器是什么? 自编码器本身就是一种BP神经网络. 它是一种无监督学习算法. 我们都知道神经网络能够从随意精度逼近随意函数,这里我们让神经网络目标值等于输出值x,也就是模拟一个恒等函数: 太无聊了,是吗?输入等于输出,这网络有什么意义?可是.当我们把自编码神经网络增加某些限制,事情就发生了变化. 如图1所看到的,这就是一个主要的自编码神经网络.能够看到隐含层节点数量要少于输入层节点数量. 图1 举个样例,假设我们输入一张10*10的图像,这样就有100个像素,所以输入层和输出层的节点数量就是1

稀疏自编码器及其实现——如何搞基

自编码器是什么? 自编码器本身就是一种BP神经网络.它是一种无监督学习算法. 我们都知道神经网络可以从任意精度逼近任意函数,这里我们让神经网络目标值等于输出值x,也就是模拟一个恒等函数: 太无聊了,是吗?输入等于输出,这网络有什么意义?但是,当我们把自编码神经网络加入某些限制,事情就发生了变化.如图1所示,这就是一个基本的自编码神经网络,可以看到隐含层节点数量要少于输入层节点数量. 图1 举个例子,如果我们输入一张10*10的图像,这样就有100个像素,所以输入层和输出层的节点数量就是100.而

深度学习UFLDL老教程笔记1 稀疏自编码器Ⅱ

稀疏自编码器的学习结构: 稀疏自编码器Ⅰ: 神经网络 反向传导算法 梯度检验与高级优化 稀疏自编码器Ⅱ: 自编码算法与稀疏性 可视化自编码器训练结果 Exercise: Sparse Autoencoder 自编码算法与稀疏性 已经讨论了神经网络在有监督学习中的应用,其中训练样本是有类别标签的(x_i,y_i). 自编码神经网络是一种无监督学习算法,它使用了反向传播算法,并让目标值等于输入值x_i = y_i . 下图是一个自编码神经网络的示例. 一次autoencoder学习,结构三层:输入层

UFLDL教程笔记及练习答案六(稀疏编码与稀疏编码自编码表达)

稀疏编码(SparseCoding) sparse coding也是deep learning中一个重要的分支,同样能够提取出数据集很好的特征(稀疏的).选择使用具有稀疏性的分量来表示我们的输入数据是有原因的,因为绝大多数的感官数据,比如自然图像,可以被表示成少量基本元素的叠加,在图像中这些基本元素可以是面或者线. 稀疏编码算法的目的就是找到一组基向量使得我们能将输入向量x表示成这些基向量的线性组合: 这里构成的基向量要求是超完备的,即要求k大于n,这样的方程就大多情况会有无穷多个解,此时我们给

UFLDL 教程答案 稀疏编码与softmax篇的答案已经传到资源,大家可以免费下载~

UFLDL 教程答案 稀疏编码篇与softmax篇的答案已经传到资源,大家可以免费下载~ 另外,关于资源里面描述的低效率的代码的问题,逗比的博主已经找到了解决方案,大家需要修改两个文件的两处代码,绿色是需要被注释的 softmaxCost.m文件 %% 非向量化 %for i = 1 : numCases %    thetagrad = thetagrad + (groundTruth(:,i) - Hx(:,i)) * data(:,i)'; % 10 * 100, 8 * 100 %end

UFLDL教程笔记及练习答案三(Softmax回归与自我学习)

1:softmax回归 当p(y|x,theta)满足多项式分布,通过GLM对其进行建模就能得到htheta(x)关于theta的函数,将其称为softmax回归.教程中已经给了cost及gradient的求法.需要注意的是一般用最优化方法求解参数theta的时候,采用的是贝叶斯学派的思想,需要加上参数theta. 习题答案: (1) 数据加载------代码已给 (2) %% STEP 2: Implement softmaxCost   得到计算cost和gradient M = theta