Win10:tensorflow学习笔记(4)

前言

学以致用,以学促用。输出检验,完整闭环。

怕什么真理无穷,进一寸有一寸的欢喜——胡适

目录:

Tensorflow实现自编码器(autoencoder)和多层感知机(multi-layer perception)

hello-world项目已经实现,现在可以开始进行下一阶段了。
基本的神经元实现后,接下来将是两个很基本但很有用的网络吧。

1自编码器(AutoEncoder)

传统机器学习任务很大程度上依赖于特征工程,比如说体重和身高的比值,直径和周长的比值,要想提取到合适的特征,需要工程师对领域背景有很深的认知与了解。而深度学习则可以解决人工难以提取有效的特征的问题,它可以缓解机器学习模型对特征的依赖。也因此深度学习在早期被认为是一种无监督的特征学习,模仿了人脑对特征逐层抽象提取的过程。
这里面有两点很重要:

  • 无监督学习,不需要对数据进行标注,事实上标注好的数据集,是非常宝贵的资源,深度学习,学习到的是数据内容组织形式的学习,提取的是频繁出现的特征。

  • 逐层抽象,特征是需要不断抽象的,就像我们对概念的学习,总是从简单的开始。

举个例子,你是怎么认出一个人的?
光从图片上去看,是看不出结果的,所以你对图片上的东西进行分类,这是鼻子,这是耳朵,这是嘴巴,这整体是我的小伙伴。
基本概念讲到这里,下面引入自编码器。

1.1自编码器起源

在之前研究稀疏编码(sparse coding)时,学者们收集了大量黑白风景照,并从中提取了许多16像素*16像素的图像碎片。在对图像碎片研究后,发现几乎所有的图像碎片都可以由64种正交的边组合得到,在对其他数据进行研究的时候也发现了。而这就是特征的稀疏表达,使用少量的基本特征组合拼装得到更高些抽象层的特征。
通常我们也需要多层的神经网络,对每一层神经网络来说,前一层的输出都是未加工的像素,而这一层则是对像素进行加工组织成更高阶的特征(即前面提到的将边组合成图像碎片)。
这里写图片描述
特征边。

1.2自编码器

无监督自编码器,使用自身的高阶特征编码自己。自编码器是一种特殊的神经网络,它的输入和输出是一致的,它借助稀疏编码的思想,目标是使用稀疏的一些高阶特征重新组合来重构自己。因此,它的特点是非常明显:第一,期望输入/输出一致;第二,希望使用高阶特征来重构自己,而不只是复制像素点。
Hinton教授在SCIENCE发表文章,讲解了使用自编码器对数据进行降维的方法。Hinton还提出了基于深度信念网络(DBN)可使用无监督的逐层训练的贪心算法,为训练很深的网络结构提供了一个可行的方案:
我们可能很难直接训练极深的网络,但是可以用无监督的逐层训练提取特征,将网络的权重初始化到一个比较好的位置,辅助后面的监督训练。
无监督的逐层训练,其思想和自编码器(autoencoder)非常相似。后者的目标是让神经网络的输出能和原始输入一致,相当于学习一个恒等式x=y,如图4-3所示。自编码器的输入节点和输出节点是一致的,但如果只是单纯地逐个复制输入节点则没有意义,像前面提到的,自编码器通常希望使用少量稀疏的高阶特征来重构输入,所以我们可以加入几种限制:

  • 如果限制中间隐含层节点的数量,则可以实现降维,学习到最重要的特征。如果再加一个l1正则化约束,那学习到的就更是最主要最重要的特征了。
  • 如果给数据加入噪声,那么就是Denoising Autoencoder,去噪自编码器,将学习到更主要的特征

    对于噪声的设置也是一个trick,不同的噪声有不同的优点,需要具体体会。

    1.3DBN(深度信念网络)

    如果自编码器的隐含层只有一层,那么其原理类似于主成分分析(PCA)。hinton提出的DBN模型有多个隐含层,每个隐含层都是限制性玻尔兹曼机(RBM,一种具有特殊连接分布的神经网络)。
    DBN训练时,需要先对每两层间进行无监督的预训练,这个过程就相当于一个多层的自编码器,可以将整个网络的权重初始化到一个理想的分布。最后,通过反向传播算法调整模型权重,这个步骤会使用经过标注的信息来做监督性的分类训练。当年DBN给训练深层深层的神经网络带来了可能性,它能解决网络过深带来的梯度弥散(gradient vanishment)问题,让训练变得容易。简单地说,HInton的思路就是先用自编码器的方法进行无监督的预训练,提取特征并初始化权重,然后使用标注信息进行监督式的训练。当然自编码器的作用不仅局限于给监督训练做预训练,直接使用自编码器进行特征提取和分析也是可以的。现实中数据最多的还是未标注的数据,因此自编码器拥有许多用武之地。

1.4自编码器实现

下面我们就开始实现最具代表性的去噪自编码器。去噪自编码器的使用范围最广也最通用。而其它几种自编码器,读者可以对代码加以修改自行实现,其中无噪声的自编码器只需要去掉噪声,并保证隐含层节点小于输入层节点:Masking Noise的自编码器只需要


参考:tensorflow实战

猜你喜欢

转载自blog.csdn.net/lvsehaiyang1993/article/details/80542957