TensorFlow实现自编码器

本文介绍了自编码器在深度学习中的作用,特别是作为无监督特征学习的工具。自编码器通过高阶特征的重构来学习数据,分为有监督和无监督两种情况。文章详细阐述了自编码器的特点、结构,并探讨了去噪自编码器的应用。以TensorFlow为例,展示了如何构建和训练去噪自编码器,包括数据预处理、权重初始化、损失函数计算等步骤。
摘要由CSDN通过智能技术生成

自编码器介绍:
深度学习可以解决一些人工难以提取有效特征的问题。在深度学习的早期,它一直被认为是一种无监督特征学习的方法。对于深度学习用于特征学习有两个关键点:
1)无监督学习,即不需要标注的数据就可以对数据进行一定程度的学习,提取频繁出现的特征;
2)逐层抽象,即从简单的微观的特征开始,不断抽象特征的层级,逐渐往复杂的宏观特征转变。例如以汽车图片为例,深度学习的特征学习过程为:将一张图片的原始像素慢慢抽象,从像素组成点、线,再将点线组成小零件,再将小零件组成车轮、车窗、车身等高阶特征,这便是深度学习在训练过程中所做的特征学习。

特征是可以进行不断抽象转化为高一级的特征,那我们如何找到一些基本的结构,然后如何抽象呢?主要可以分为两种情况:
1)在有很多标注的数据时,可以使用训练一个深层的神经网络来获得;
2)在没有标注数据时,我们可以使用无监督的自编码器来提取特征。

自编码器,即可以使用自身的高阶特征编码自己。自编码器也是一种神经网络,它的输入和输出是一致的,它借助稀疏编码器的思想,目标是使用稀疏的一些高阶特征重新组合来重构自己。
它的特点:
1)期望输入和输出一致,自编码器的输入节点和输出节点的数量是一致的;
2)希望使用高阶特征来重构自己,而不是复制像素点。

自编码器通常希望使用少量稀疏的高阶特征来重构输入,因此我们可以加入几种限制:
1)如果限制训练中间隐含层的节点数量,比如使中间隐含层节点的数量小于输入/输出节点的数量,就相当于一个降维的过程。只能够学习到数据中最重要的特征复原,将可能不相关的内容去除。如果再给中间隐含层的权重加入L1正则,则可以根据惩罚系数控制隐含节点的稀疏程度,系数越大,学到的特征组合越稀疏,实际使用的特征数量越少。
2)如果给数据加入噪声,那么就是去噪自编码器。我们将从噪声中学习出数据的特征,这时我们只有学习数据中频繁出现的模式和结构,将无规律的噪声略去,才可以复原数据。去噪自编码器中最长使用的噪声是加性高斯噪声。
如果自编码器的隐含层只有一层,那么其原理类似于主成分分析(PCA)。

自编码器的结构图如下图所示:
这里写图片描述

在训练很深的神经网络时,直接训练会变得非常困难,Hinton提出了一种可行的方案:
1)可以使用无监督的逐层训练提取特征,将网络权重的初始化到一个比较好的位置,辅助后面的监督训练。
2)利用监督方法训练整个网络。
其中无监督的逐层训练,其思想和自编码器非常相似。
同时,Hinton提出的DBN模型,它包括多个隐含层,每个隐含层都是限制玻尔兹曼机。DBN在训练时,需要对每两层间进行无监督的预训练,这个过程其实就相当与一个多层的自编码器,可以将整个网络的权重初始化到一个理想的分布,最后通过反向传播算法调整模型的权重,这个过程会使用经过标注信息来做监督性的分类训练。上述两个过程,能够很好的解决由于神经网络过深导致的梯度弥散的问题。

下面我们以去噪自编码器为例,简单介绍一下如何使用TensorFlow实现自编码器。

import numpy as np
import sklearn.preprocessing as prep
import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data

def xavier_init(fan_in, fan_out, constant=1):
    # 权重初始化,使得权重满足(low, high)的均匀分布
    # fan_in: 输入节点的数量; fan_out: 输出节点的数量
    low = -constant * np
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值