自编码 Autoencoder (非监督学习) - Tensorflow | 莫烦Python
切换视频源:

自编码 Autoencoder (非监督学习)

作者: Hao 编辑: 莫烦 2016-11-03

学习资料:

要点

Autoencoder 简单来说就是将有很多Feature的数据进行压缩,之后再进行解压的过程。 本质上来说,它也是一个对数据的非监督学习,如果大家知道 PCA (Principal component analysis), 与 Autoencoder 相类似,它的主要功能即对数据进行非监督学习,并将压缩之后得到的“特征值”,这一中间结果正类似于PCA的结果。 之后再将压缩过的“特征值”进行解压,得到的最终结果与原始数据进行比较,对此进行非监督学习。如果大家还不是非常了解,请观看机器学习简介系列里的 Autoencoder 那一集; 如果对它已经有了一定的了解,那么便可以进行代码阶段的学习了。大概过程如下图所示:

5_11_1.png

今天的代码,我们会运用两个类型:

  • 第一,是通过Feature的压缩并解压,并将结果与原始数据进行对比,观察处理过后的数据是不是如预期跟原始数据很相像。(这里会用到MNIST数据)
  • 第二,我们只看 encoder 压缩的过程,使用它将一个数据集压缩到只有两个Feature时,将数据放入一个二维坐标系内,特征压缩的效果如下:

5_11_2.png

同样颜色的点,代表分到同一类的数据。(Lebel相同)

Autoencoder

我们的MNIST数据,每张图片大小是 28x28 pix,即 784 Features:

  • 在压缩环节:我们要把这个Features不断压缩,经过第一个隐藏层压缩至256个 Features,再经过第二个隐藏层压缩至128个。
  • 在解压环节:我们将128个Features还原至256个,再经过一步还原至784个。
  • 在对比环节:比较原始数据与还原后的拥有 784 Features 的数据进行 cost 的对比,根据 cost 来提升我的 Autoencoder 的准确率,下图是两个隐藏层的 weights 和 biases 的定义:

下面来定义 EncoderDecoder ,使用的 Activation function 是 sigmoid, 压缩之后的值应该在 [0,1] 这个范围内。在 decoder 过程中,通常使用对应于 encoder 的 Activation function:

来实现 EncoderDecoder 输出的结果:

再通过我们非监督学习进行对照,即对 “原始的有 784 Features 的数据集” 和 “通过 'Prediction' 得出的有 784 Features 的数据集” 进行最小二乘法的计算,并且使 cost 最小化:

最后,通过 Matplotlibpyplot 模块将结果显示出来, 注意在输出时MNIST数据集经过压缩之后 x 的最大值是1,而非255:

通过5个 Epoch 的训练,(通常情况下,想要得到好的的效果,我们应进行10 ~ 20个 Epoch 的训练)我们的结果如下:

5_11_3.png

上面一行是真实数据,下面一行是经过 encoderdecoder 之后的数据,如果继续进行训练,效果会更好。

Encoder

在类型二中,我们只显示 encoder 之后的数据, 并画在一个二维直角坐标系内。做法很简单,我们将原有 784 Features 的数据压缩成仅剩 2 Features 的数据:

通过四层 Hidden Layers 实现将 784 Features 压缩至 2 Features:

Weights 和 biases 也要做相应的变化:

与类型一类似,创建四层神经网络。(注意:在第四层时,输出量不再是 [0,1] 范围内的数,而是将数据通过默认的 Linear activation function 调整为 (-∞,∞) :

在输出图像时,我们只关心 encoder 压缩之后,即 decoder 解压之前的结果:

5_11_4.png


降低知识传递的门槛

莫烦很常从互联网上学习知识,开源分享的人是我学习的榜样。 他们的行为也改变了我对教育的态度: 降低知识传递的门槛免费 奉献我的所学正是受这种态度的影响。 通过 【赞助莫烦】 能让我感到认同,我也更有理由坚持下去。

    Tensorflow