深度学习入门教程UFLDL学习实验笔记一:稀疏自编码器
UFLDL即(unsupervised feature learning & deep learning)。这是斯坦福网站上的一篇经典教程。顾名思义,你将在这篇这篇文章中学习到无监督特征学习和深度学习的主要观点。
UFLDL全文出处在这:http://ufldl.stanford.edu/wiki/index.php/UFLDL%E6%95%99%E7%A8%8B,本文为本人原创,参考了UFLDL的教程,是我自己个人对于这一系列教程的理解以及自己的实验结果。非盈利性质网站转载请在文章开头处著名本文作者:77695,来源http://www.cnblogs.com/cj695/。盈利性质网站转载请与作者联系,联系方式在文章后面。如未联系,本人将通过一切可能且合法的途径追缴相应稿酬。请在转载时保留此声明。
神经网络
一个神经网络由一系列神经元组成,一个神经元由一系列参数x1,x2。。。及偏置量+1作为输入,将输入与对应权值W(与x1,x2。。。相乘),(与1相乘)相乘后求和,并将和放入激活函数,即可得到该神经元的输出。我们称这个神经元的输入-输出映射关系其实就是一个逻辑回归(logistic regression)

在这里激活函数我们用:
他的导数是右边的形式
这是sigmoid函数的图像

整个神经元可以用一个公式表示:

神经网络就是很多个神经元组合在一起,一个神经元的输出,也可以是另外一个神经元的输入,如下图:

具体请直接查看UFLDL相应教程,这里不再赘述,下文一样。
反向传导算法
一个神经网络向前传导,其神经元的参数可以是各种各样的,这样也会导致各种各样的借,而我希望我整个神经网络的输出,是与我预期的输出越相近越好,为了描述相近的程度,我们计算神经网络输出与预计输出的差值的平方和。这个和越小,即输出与预期越接近,我们称这个叫做代价函数。但使得输出与预期接近的W参数组合有很多,并不是每一种组合都好,也不是说越接近越好,当W参数太大的时候,会发生过拟合,使得泛化能力不够,因此我们引入所有W的平方和,加入到代价函数中,我们称它叫惩罚项。我们使用梯度下降法,求得最优的W,b这就是机器学习的整个过程。梯度下降中,其实就是求得代价函数对W,b的偏导值。在计算偏导的时候,因为复合函数的求导法则:

可以看到,要求整个惩罚函数的导数首先就要计算从惩罚函数开始向后求导,具体公式这里就不贴了。
梯度检验
要检测自己反向传导得到的偏导函数是否正确,这里有一种简单粗暴的方法,就是梯度检验,通过对某一个参数加以及减一个较小的值的差除以2倍较小的值即可近似算出该点偏导值,因此可以用来检验偏导是否计算正确。但为什么我们不直接用这个计算代替求偏导函数,因为太慢了!


在这里我们用L-BFGS算法快速计算偏导数
自编码算法与稀疏性

使得输出尽可能与输入一致我们称之为自编码。比如,若隐藏层神经元数目小于输入层,则这个网络就要学习怎么去压缩这些数据。使得神经元大部分的时间都是被抑制的限制则被称作稀疏性限制。其惩罚函数如下:



可视化自编码器训练结果
可以证明,
时有单元i有最大激励。
实现
生成数据集:即从所有10副512x512的图片中取8x8的块,一共取10000块。



这是数据集的一些图片,可以看到这主要是一些自然图片。
这里只粘贴所有自己实现部分的代码。
[w,h,n]=size(IMAGES);
randx=randi(w-patchsize,1,numpatches);
randy=randi(h-patchsize,1,numpatches);
randIdx=randi(n,1,numpatches); for i=1 : numpatches
pc=IMAGES(randx(i):randx(i)+patchsize-1,randy(i):randy(i)+patchsize-1,randIdx(i));
patches(:,i)=pc(:);
end
生成结果如下:

实现惩罚函数以及梯度函数:按照之前的公式计算,大家直接看代码吧。
[l,n]=size(data);
dataHidden=sigmoid(W1*data+b1*ones(1,n));
dataOut=sigmoid(W2*dataHidden+b2*ones(1,n));
rou=sum(dataHidden,2)/n;
spCost=beta*(sum((sparsityParam*log(sparsityParam*ones(size(rou))./rou)...
+(1-sparsityParam)*log(((1-sparsityParam)*ones(size(rou)))./(1-rou)))));
xyCost=(sum(sum((dataOut-data).*(dataOut-data))))/2/n;
wCost=(lambda/2)*((sum(sum(W1.*W1))+sum(sum(W2.*W2))));
cost=wCost+xyCost+spCost;
delta3=-(data-dataOut).*dataOut.*(1-dataOut);
spDt=beta*((-sparsityParam*ones(size(rou))./rou)+(((1-sparsityParam)...
*ones(size(rou)))./(ones(size(rou))-rou)));
delta2=((W2')*delta3+spDt*ones(1,n)).*dataHidden.*(1-dataHidden);
W2grad=(delta3*(dataHidden'))/n+lambda*W2;
W1grad=(delta2*(data'))/n+lambda*W1;
b2grad=delta3*ones(n,1)/n;
b1grad=delta2*ones(n,1)/n;
实现时候出了一个问题,算梯度的时候少加了lambda*W1,粗心害死人啊!
梯度检验:按照公式实现梯度检验,检验实现的梯度是否正确。
for i=1 :(size(theta,1))
e = zeros(size(theta));
e(i)=EPSILON;
cha=(J(theta+e)-J(theta-e));
numgrad(i)=cha/(2*EPSILON);
end
看到运行结果

只差10^-12数量级,说明梯度检验的实现没错
训练以及结果:
最后运行得到结果如下:

可以看到学习出来的结果基本是图片相互正交的部分,相当于傅立叶变换中不同频率正弦波,相当于很多正交的基,这些“基”以一定的权重相加,就能够近似组成任何一个8x8的图片块。
另外值得一提的是,对于梯度下降算法,在这里使用的是L-BFGS算法,对于这个算法,我们不能将它用于商业用途,若用与商业用途的话,可以使用fminlbfgs函数,他比L-BFGS慢但可用于商业用途。
深度学习入门教程UFLDL学习实验笔记一:稀疏自编码器的更多相关文章
- 深度学习入门教程UFLDL学习实验笔记三:主成分分析PCA与白化whitening
主成分分析与白化是在做深度学习训练时最常见的两种预处理的方法,主成分分析是一种我们用的很多的降维的一种手段,通过PCA降维,我们能够有效的降低数据的维度,加快运算速度.而白化就是为了使得每个特征能有同 ...
- 深度学习入门教程UFLDL学习实验笔记二:使用向量化对MNIST数据集做稀疏自编码
今天来做UFLDL的第二个实验,向量化.我们都知道,在matlab里面基本上如果使用for循环,程序是会慢的一逼的(可以说基本就运行不下去)所以在这呢,我们需要对程序进行向量化的处理,所谓向量化就是将 ...
- 【特别推荐】Node.js 入门教程和学习资源汇总
这篇文章与大家分享一批很有用的 Node.js 入门教程和学习资源.Node 是一个服务器端的 JavaScript 解释器,它将改变服务器应该如何工作的概念.它的目标是帮助程序员构建高度可伸缩的应用 ...
- Node.js 入门教程和学习资源汇总
这篇文章与大家分享一批很有用的 Node.js 入门教程和学习资源.Node 是一个服务器端的 JavaScript 解释器,它将改变服务器应该如何工作的概念.它的目标是帮助程序员构建高度可伸缩的应用 ...
- ROS与深度相机入门教程-在ROS使用kinect v1摄像头
ROS与深度相机入门教程-在ROS使用kinect v1摄像头 说明: 介绍在ros安装和使用kinect v1摄像头 介绍freenect包 安装驱动 deb安装 $ sudo apt-get in ...
- 《Python爬虫学习系列教程》学习笔记
http://cuiqingcai.com/1052.html 大家好哈,我呢最近在学习Python爬虫,感觉非常有意思,真的让生活可以方便很多.学习过程中我把一些学习的笔记总结下来,还记录了一些自己 ...
- TensorFlow和深度学习入门教程(TensorFlow and deep learning without a PhD)【转】
本文转载自:https://blog.csdn.net/xummgg/article/details/69214366 前言 上月导师在组会上交我们用tensorflow写深度学习和卷积神经网络,并把 ...
- Python学习入门教程,字符串函数扩充详解
因有用户反映,在基础文章对字符串函数的讲解太过少,故写一篇文章详细讲解一下常用字符串函数.本文章是对:程序员带你十天快速入门Python,玩转电脑软件开发(三)中字符串函数的详解与扩充. 如果您想学习 ...
- LINQ学习入门教程(一)
LINQ 查询简介 Linq 是一跨各种数据源和数据格式的数据模型:它在查询是,始终是把它作为一种对象来操作,可以使用基本相同的编码模型查询和数据的转换XML,SQL,ADO数据等: Li ...
随机推荐
- Android之POST方法的使用
java代码 package xidian.dy.com.chujia; import android.os.Bundle; import android.os.Handler; import and ...
- DOM(八)使用DOM控制表单
1.表单简介 表单<form>是网页中交互最多的形式之一,它通过各种形式接收用户的数据,包括下拉列表框,单选按钮,复选框和文本框,本篇主要介绍表单中常用的属性和方法 javascript中 ...
- EF—主键冲突解决办法
报错信息: 编辑代码: 解决办法: 在Controller中不要把实体直接传过去,而要根据id先查出来,然后把查出来的实体传递过去就OK了
- 如何在Dreamweaver中使用emmet
by zhangxinxu from http://www.zhangxinxu.com本文地址:http://www.zhangxinxu.com/wordpress/?p=3666 一.emmet ...
- java.lang.NoClassDefFoundError: antlr/ANTLRException
在用Hibernate进行查询时,出现这样的错误:Exception in thread "main" java.lang.NoClassDefFoundError: antlr/ ...
- 【codevs 1200】【NOIP 2012】同余方程 拓展欧几里德求乘法逆元模板题
模板,,, #include<cstdio> using namespace std; void exgcd(long long a,long long b,long long & ...
- NOI题库--砝码称重V2(多重背包2^n拆分)
以前只会写多重背包的原版,渣的不行,为了做此题不得不学习了一下,发现其实也不难,只要理解了方法就好多了(PS:其实和倍增挺像的) 8756:砝码称重V2 总时间限制: 1000ms 内存限制: 655 ...
- C++处理一个动态规划的问题
嗯哼,别人问的问题,看的我也头晕,百度了一下动态规划,看了看才想起来该怎么做,今天写了写代码,实现了~ 要求是递归,动态规划,想了想这种方法也是最简单的~ 所谓动态规划:把多阶段过程转化为一系列单阶段 ...
- 使用 Python 抓取欧洲足球联赛数据
Web Scraping在大数据时代,一切都要用数据来说话,大数据处理的过程一般需要经过以下的几个步骤 数据的采集和获取 数据的清洗,抽取,变形和装载 数据的分析,探索和预测 ...
- ExtJS入门教程06,grid分页的实现
前面两篇内容分别介绍了extjs grid的基本用法和extjs grid异步加载数据,这篇文章将介绍extjs grid的分页. 数据量大的时候我们必须用到分页,结合上一篇的异步加载数据,今天我们就 ...