深度学习系列(六):自编码网络的特征学习_on2way的博客-程序员宅基地

技术标签: 编码  深度学习  模式识别&机器学习  

在第三节我们已经介绍了
简单网络的自编码学习
知道了自编码学习其实就是学习到了输入数据的隐含特征,通过新的特征来表征原始数据,本节将介绍如何使用这些隐含特征进行模式分类;
还是以前面的三层自编码网络:
这里写图片描述
抽象一下如下:
这里写图片描述
其中学习到的权值系数W1与W1’是不一样的,我们把W1叫做编码权值,W1’叫做译码权值,原始数据在编码权值下的新数据Y就可以视为学习到了新维度下的数据,这在第三节也说过。那么如果我们用自编码学习并计算出到Y,再把Y用于分类,就可以构成神经网络的分类器了,网络深了就是深度网络的分类器了,当然后面接分类器可以是常用的分类器,比如SVM,贝叶斯,logistics,等等,也可以在接一个神经网络分类器。本实验为了比较我们在Y后面接SVM分类器看看,那么在上面一步完成后我们的分类器就变成下面这样子:
这里写图片描述
这里我们以手写体实验,所以输入固定了为784维。至于隐含层为多少是可以设计的k。

Ok理论分析到此,我们来看看上节介绍的工具箱如何实现吧

首先是三层自编码网络的实现,假设k=100吧,那么我们网络结构是不是[784,100,784],像第三节做的那样,只不过第三节没有权值的稀疏性,而在这里我们要加入稀疏性了与一些去噪功能了。

Ok找到在工具箱DeepLearnToolbox\tests\test_example_SAE.m文件
把要说明的拿出来:

function test_example_SAE
load mnist_uint8;
choose_num_train = 10000;
choose_num_test= 200;
%初始化预处理
train_x = double(train_x(1:choose_num_train,:))/255;
test_x  = double(test_x(1:choose_num_test,:))/255;
train_y = double(train_y(1:choose_num_train,:));
test_y  = double(test_y(1:choose_num_test,:));

%%  ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN
%  Setup and train a stacked denoising autoencoder (SDAE)
rand('state',0)
sae = saesetup([784 100]);%自编码网络的初始化,输出==输入,所以省略第三个784
sae.ae{
    1}.activation_function       = 'sigm';%将隐含层激活函数设置为sigm
sae.ae{
    1}.learningRate              = 1;%定义学习率
sae.ae{
    1}.inputZeroMaskedFraction   = 0.5;%定义0模板大小
opts.numepochs =   1;%重复迭代次数
opts.batchsize = 100;%数据块大小--每一块用于一次梯度下降算法
sae = saetrain(sae, train_x, opts);%训练
visualize(sae.ae{
    1}.W{
    1}(:,2:end)')%可视化编码矩阵的权值

对此在说明几点:
(1)自编码网络的初始化saesetup,打开看看

function sae = saesetup(size)
    for u = 2 : numel(size)
        sae.ae{u-1} = nnsetup([size(u-1) size(u) size(u-1)]);
    end
end

可以看到网络为[size(u-1) size(u) size(u-1)],因为是自编码输出等于输入个数;

(2)关于自编码的nnsetup,在这个nnsetup里面,因为我们想适当的稀疏下权值,所以改变初始化的参数nn.nonSparsityPenalty,假设设置为0.05.

(3)关于另一个参数说明:sae.ae{1}.inputZeroMaskedFraction =0.5,这个参数是什么意思呢?就是以一定概率将输入值变成0,增加输入的鲁棒性,抗噪声能力。我们可以再nntrain里面看到代码:

  %Add noise to input (for use in denoising autoencoder)
        if(nn.inputZeroMaskedFraction ~= 0)
            batch_x = batch_x.*(rand(size(batch_x))>nn.inputZeroMaskedFraction);
        End

这就是当inputZeroMaskedFraction 不为0时需要执行的,看看执行了什么,是不是人为将一些输入改变成0了呀?更直观的解释为,比如一个输入来了,大小为784*1,假设里面有100个0,那么经过这么段程序后可能就变成了200个0了,防止过拟合作用,理解了吧,对于这种抗造性的网络修改操作,还有一篇相关论文专门介绍的可以看看http://www.cs.toronto.edu/~hinton/absps/dropout.pdf

最后就是可视化这个结果了,那么可视化的是编码权值矩阵,也就是W1。按照上面的设置我们先来看看可视化的结果吧(第三节我们也有可视化的介绍,在哪里效果可不怎么样):
注意需要设置的几个参数:要把nnsetup里面的nn.nonSparsityPenalty=0.05)
这里写图片描述
可以看到,编码矩阵的可视化结果,很明显的有一些手写体轮廓痕迹吧。把nn.nonSparsityPenalty调厉害点比如为0.2,结果为:
这里写图片描述
差了点吧,稀疏的越厉害,表示权值中需要归0或者很小的权值就越多,那么表示出来就是上面这个样子。这说明稀疏太狠了,就好像第四节中解释的那样子,本来一个向量至少需要3个基向量来表示才行,你非要稀疏到用一个基向量表示,结果能不差吗?

Ok,再来解释下这个可视化的结果到底是什么吧。把训练好的网络拿出来这样子的:
这里写图片描述

好了对于隐含层的100个单元的每一个单元,比如Y1,那么所有输入是不是有个权值到Y1,从Y(1,1)到Y(1,784),如上所示。那么再把这784向量变成28*28图像显示出来,就是输入相对于第一个隐含单元学到的特征权值,得到的值Y就是在这个隐含单元下的特征。这样还有其他99个隐含单元都显示出来就是上述见到的那个100个图了,每个图的大小为28*28。当然具体可视化的时候可能把数据归一化了等等处理了才显示出来的。

至此自编码特征学习、可视化到此了。784维数据经过编码就变成100维了,其实呢这个过程就是降维了,这就不经想起了这个过程非常像数据的PCA降维是不是,假设取784PCA一下变成100,你去研究发现他们出来的这100维结果其实很像,然而自编码更好,为什么?PCA毕竟给了个规则然后提取的特征,然而自编码呢?机器学习到的特征,这也就是为什么深度学习效果好,因为他的特征是自己学的,摆脱了传统意义上的手工设计的特征,相比之下,人再聪明,在其他条件一致的情况下,能比得过机器?而模式识别分类领域最重要的是什么?特征的选择,当特征的选择也可以用机器来做的时候,那么伟大的革新就即将诞生。

Ok扯远了,为了进一步比较深度学习学到的特征用于分类,以及与PCA的比较,待下回分享。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/on2way/article/details/50390595

智能推荐

Mysql产品介绍_mysql是哪一年的产品-程序员宅基地

Mysql产品介绍1、Mysql程序结构图2、Mysql产品的特点MySQL数据库隶属于MySQL AB公司,总部位于瑞典优点:成本低:开放源代码,一般可以免费试用性能高:执行很快可信赖:某些非常重要和声望很高的公司都用MySQL来处理自己的重要数据。简单:很容易安装和使用DBMS分为两类基于共享文件系统的DBMS (Access )小型数据库,没有服务端和客户端基于客户机——服务器的DBMS(MySQL、Oracle、SqlServer)3、Mysql的版本社区版(免费)企业_mysql是哪一年的产品

实验吧-隐写术 Chromatophoria-程序员宅基地

题目链接: http://ctf5.shiyanbar.com/stega/chromatophoria/steg.png(While refueling at a gas giant, you are hailed by a race of cuttlefish-people who dwell within it. Their transmission is entirely visual;..._chromatophoria

解决安装oracle时指定的SID已在本机上使用_指定的sid已在使用-程序员宅基地

1、安装oracle的时候如果出现了,指定的SID在本机上已经存在。这样的报错的话。这边你肯定是第二次在安装你的oracle了,这里出现这样的错误是你没有吧原先的那些关于oracle的东西给清理干净,这里我们先再次的对你的oracle进行一次彻底的卸载。2、首先启动你的计算机→管理→服务,然后关掉你oracle的所有相关服务。3、打开开始菜单,找到oracle根目录 选择里面地的Universal installer然后打开,进入如下的图标之后呢,选择卸载产品,在点击完卸载产品后呢,这里的所有父类子_指定的sid已在使用

jupyter notebook 插入图片-程序员宅基地

jupyter notebook 插入图片应该使用Markdown语句。<img style="float: right;" src="图片" width="100%">

AJAX异步请求判断用户名是否符合要求-程序员宅基地

一、ajax的作用ajax实现了浏览器网页与服务器的异步传输,在不需要重新加载网页的情况下可以更新网页内容,例如,输入用户名,在不点击提交的情况下就可以检查到用户名的输入是否符合规范!二、代码展示register.jsp<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%><!DOCTYPE html><html><head&g

java写入 3rdsession_关于微信小程序登录,后端如何生成3rd_session?(后端为c#)...-程序员宅基地

Flask与微信小程序登录&lpar;后端&rpar;开发微信小程序时,接入小程序的授权登录可以快速实现用户注册登录的步骤,是快速建立用户体系的重要一步.这篇文章将介绍 python + flask + 微信小程序实现用户快速注册登录方案(本文主要进行后 ...微信小程序登录对接Django后端实现JWT方式验证登录先上效果图 点击授权按钮后可以显示部分资料和头像,点击修改资料可以..._微信小程序 生成3d_session

随便推点

最受欢迎 Top 12 Python 开源框架,你都用过吗?| 原力计划-程序员宅基地

作者 |学Python的阿勇责编 | 夕颜出品 | 程序员宅基地今天给大家带来了12个在GitHub等开源网站中最受欢迎的Python开源框架。如果你正在学习python,那么这12个...

vi/vim 使用和配置-程序员宅基地

vim配置设置 gedit ~/.vimrc || vim ~/.vimrc----------------------------------------------------------------------------------------------------------------" 设置字符编码 ...

华为 弹性云服务器 外网访问不了web项目 购买硬盘怎么没有了 解决方法-程序员宅基地

安全组默认规则作用是什么?安全组规则入方向表示外部访问弹性云服务器,出方向表示弹性云服务器访问外部。弹性云服务器加入安全组后,如果安全组中没有任何规则,则弹性云服务器无法访问外部网络,同时外部网络也无法访问弹性云服务器。安全组默认出方向规则表示弹性云服务器可以访问外部,默认入方向规则表示弹性云服务器可以被同一安全组内其他弹性云服务器访问。需要注意的是,安全组不能解决网络故障或网络配置错误类问题。例如

AIX系统学习之-ODM管理-程序员宅基地

AIX系统学习之-ODM管理 AIX ODM(Object Database Manager)是由一组对象类和对象所组成的数据库。对象类相当于Oracle数据库中的object,由ODM create创建,删除可以使用ODM drop,对象就相当于object下的数据(比如磁盘、Adapter等),可以使用ODM add命令加入对象,使用ODM delete命

webpack5(上)_npx babel-watch回滚_山竹回家了的博客-程序员宅基地

一、小试webpack1.安装webpack前提条件:在开始之前请确保安装了node.js,因为webpack是在node基础上运行了.webpack安装有两种:1.全局安装2.在本地工作目录下安装.安装webpack需要安装两个包:1.webpack主包2.webpack-cli,这个安装好后可以在命令行里执行命令1.1全局安装global是指在全局的情况下安装 npm install webpack webpack-cli --global查看webpack -v1_npx babel-watch回滚

sqlserver 约束-程序员宅基地

sqlserver 约束SQLServer - 约束一、约束的分类  在SQLServer中,有3种不同类型的约束。  1、实体约束    实体约束是关于行的,比如某一行出现的值就不允许出现在其他行,例如主键。  2、域约束    域约束是关于列的,对于所有行,某一列有那些约束,例如CHECK约束。  3、参照完整性约束    如果某列的值...

推荐文章

热门文章

相关标签