算法实现过程的详细介绍
首先介绍一下自编码器,Hinton教授在Science发表了文章Reducing the dimensionality of data with neural networks,讲解使用自编码器进行降维的方法,自编码器就是可以使用自身的高阶特征编码自己。自编码器的输入节点和输出节点是一致的,但如果只是单纯的逐个复制输入节点则没有意义,所以我们可以加入几种限制:
(1)如果限制中间隐藏节点的数量,比如让中间隐含节点的数量小于输入/输出节点的数量,就相当于一个降维的过程。
(2)如果给数据加入噪声,那么就是Denoising AutoEncoder(去噪自编码器),我们将从噪声中学习到数据的特征。
下面就来实现去噪自编码器。
- 导入常用库NumPy,还有Scikit-learn中的preprocessing模块,这是一个对数据进行预处理的常用模块,之后我们会用到其中的数据标准化功能,同时,这个算法依然在mnist数据集上实验,所以导入Tensorflow中MNIST数据的加载模块。
import numpy as np
import sklearn.preprocessing as prep
import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data
- 我们的自编码器会用到xavier initialization,需要先定义好它。Xavier初始化器在Caffe的早期版本中被频繁使用,它的特点是会根据某一层网络的输入,输出节点自动调整最合适的分布。Xavier从数学角度分析,就是让权重满足0均值,同时方差为2nin+nout\frac{2}{n_{in}+n_{out}}nin+nout2,分布可以用高斯或者均匀分布,我们通过tf.random_uniform创建了一个(−6nin+nout,6nin+nout)(-\sqrt\frac{6}{n_{in}+n_{out}}, \sqrt\frac{6}{n_{in}+n_{out}})(−nin+nout