自编码网络——能够自学习样本特征的网络

深度学习领域主要有两种训练模式:

  1. 监督学习:不仅有样本,还有对应的标签
  2. 非监督学习:即只有样本没有标签
    此外还有半监督学习,也属于非监督学习

非监督模型的网络——自编码网络

一、自编码网络介绍及应用

自编码网络时非监督学习领域中的一种,可以自动从无标注的数据中学习特征,是一种重构输入信号为目标的神经网路,它可以给出比原始数据更好的特征描述,具有较强的特征学习能力,在深度学习中常用自编码网络生成的特征来取代原始数据,以得到更好的结果。

二、最简单的自编码网络

自编码(Auto-Encoder,AE)网络是输入等于输出的网络,最基本的模型可以视为三层的神经网络,即输入层、隐藏层、输出层。其中,输入层的样本也会充当输出层的标签角色。这个神经网络就是一种尽可能复现输入信号的神经网络。
其中,从输入到中间状态的过程叫做编码,从中间状态在回到输出的过程叫做解码,这样构成的自动编码器可以捕捉代表输入数据的最重要的因素。
自编码器要求输出尽可能等于输入,并且隐藏层必须满足一定的稀疏行,是通过将隐藏层中的后一层个数比前一层神经元个数少的方式来实现稀疏的效果。相当于隐藏层对输入进行压缩,并在输出层中解压缩。整个过程中会丢失信息,但训练过程能使丢失的信息尽量减少。

三、自编码网络的代码实现:

1.实例76:提取图片特征,并利用特征还原图片

2.线性解码器

上实例中使用的激活函数为S型激活函数,输出范围为[0,1],当我们对最终提取特征节点采用该激励函数时,就相当于对输入限制或缩放,使其位于[0,1]范围中。有一些数据集,比如MNIST,能方便地将输出缩放到[0,1]中,但是很难满足对输入值的要求。
如果利用一个恒等式来作为激励函数,就可以很好地解决这个问题,即使用f(z)=z作为激励函数(通常只是用做最后一层输出层的激励函数)
有多个S型激活函数的隐含层及一个线性输出层构成的自编码器,称为线性编码器。

3.实例77:提取图片的二维特征,并利用二维特征还原图

4.实例78:实现卷积网络的自编码

四、去噪自编码

在实际应用中,还需要让这些特征具有抗干扰的能力,即当输入数据发生一定程度的扰动时,生成的特征仍然保持不变。这就需要添加噪声来为模型增加更大的困难。在这种情况下训练出来的模型才具有更好的鲁棒行。
去噪自动编码器(Denoising Autoencoder, DA),是在自动编码的基础上,训练数据加入噪声,输出的标签仍然是原始的样本,这样自动编码器必须学习去除噪声而获得没有被噪声污染过的输入特征。
在实际训练中,人为加入噪声有两种途径:

  1. 在训练数据集时,额外选择一些样本集以外的数据
  2. 改变已有的样本数据集中的数据(使样本个体不完整,或通过噪声与样本进行的加减乘除之类的运算,使样本数据发生变化)

五、去噪自编码网络的代码实现

1.实例79:使用去噪自编码网络提取MNIST特征

六、栈式自编码

1.栈式自编码介绍

栈式自编码神经网络(Stacked Autoencoder, SA),是对自编码网络的一种使用方式,是一个由多层训练好的自编码器组成的神经网络。由于网络中的每一层都是单独训练而来,相当于都初始化了一个合理的数值。这样的网络更容易训练,并且有更好的收敛性及更高的准确度。
栈式自编码常常被用于预训练(初始化)深度神经网络之前的权重预训练步骤,下面以训练一个包含两个隐含层的栈式自编码网络为例:

  1. 训练一个自编码器,得到原始输入的一阶特征h1,只进行编码的操作。
  2. 对上面的特征h2,再进行一次自编码,并获得特征h2
  3. 把上面的特征h2连上softmax分类器,得到图片数字标签的分类模型。
    将3层结合起来,就构成了一个包含两个隐藏层和一个softmax的栈式自编码网络

2.栈式自编码在深度学习中的意义

七、深度学习中自编码的常用方法

1. 代替和级联

栈式自编码会将网络中的中间层作为下一层的输入进行训练。我们可以得到网络中每一个中间层的原始值,还可以使用级联的方式进一步优化网络参数。
在已有的模型上接着优化参数的步骤叫做微调,通常在大量已标注训练数据的情况下使用,在这样的情况下,能显著提升分类器的性能。如果有大量未标注数据集(用于非监督特征学习/预训练),作用有限。

2.自编码的应用场景

八、去噪自编码与栈式自编码的综合实现

1. 实例80:实现去噪自编码

2. 实例81:添加模型存储支持分布训练

3. 小心分布训练中的“坑”

使用Anaconda在Windows运行时。
当加上保存模型的功能时,在训练过程中,如果运行两次读取模型则会报错。更奇怪是,在保存模型过程中,如果第一运行终止,第二次运行成功并且也生成了模型,但从模型中载入时会出现参数错误。
原因是,在Anaconda中py程序默认在同一个图中运行,同一代码运行两次时,在内存里会有两套变量。但是在读取时只是读取其中的一套。会报错。

解决方法:tf.reset_default_graph()

自己运行载入模型时,总是只能得到模型的变量值,优化器的状态不能得到,显示出现问题,重新运行优化器,不知道是不是这个原因。

九、变分自编码

1. 什么变分自编码

变分自编码学习的不再是样本的个体,而是学习样本的规律。这样训练出来的自编码不单具有重构样本的功能,还具有仿照样本的功能。
变分自编码,其实就是在编码过程中改变了样本的分布(“变分”可以理解为改变分布)。假设我们知道样本的分布函数,就可以从这个函数中随便取一个样本,然后进行网络解码层前向传导,这样就可以生成一个样本。
为了得到这个样本的分布函数,模型训练的目的将不再是样本本身,而是通过附加一个约束项,让网络生成一个服从高斯分布的数据集,根据高斯分布的均值和方差就可以取得任意相关的数据,然后通过解码层还原样本。

2. 实例82:使用变分自编码模拟生成MNIST数据

十、条件变分自编码

1. 什么是条件变分自编码

变分自编码存在一个问题——虽然可以生成一个样本,但是只能出与输入图片相同类别的样本。虽然也可以随机从符合模型生成的高斯分布中取数据来还原样本,但是这样的话我们并不知道生成的样本属于哪个类别。条件变分解码则可以解决这个问题,让网络按指定类别生成样本。
在变分自编码的基础上,再理解条件变分自编码会很容易。主要的改动是,在训练、测试时加入一个one-hot向量,用于表示标签向量。给变分自编码网络加入一个条件,让网络学习图片分布式加入了标签因素,可以按照标签的数值生成指定的图片。

2. 实例83:使用标签指导变分自编码网络生成MNIST数据

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值