自编码器
可以使用自身的高阶特征编码自己,也是一种神经网络。
特征
- 希望输入和输出是一致的
- 希望使用高阶特征来重构自己,而不只是复制像素点
自编码器通常希望使用少量稀疏的高阶特征来重构输入,所以加入以下限制:
- 限制中间隐含层节点的数量,比如让中间隐含层节点的数量小于输入/输出节点的数量
- 如果给数据加噪声,那么就是Denoising AutoEncoder(去燥自编码器),我们可以从噪声中学习出数据的特征。
下面我们将实现最具代表性的去燥自编码器。
第一步:导入各种库
# 1. 导入各种库
import numpy as np
import sklearn.preprocessing as prep # Scikit-learn中的preprocessing是对数据进行预处理的常用模块
import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data
第二步:定义参数初始化方法:xavier initialization
自编码器中会使用到一种参数初始化方法xavier initialization,它会根据根据某一层网络的输入、输出节点数量自动调整最合适的分布。
- 深度学习模型的权重初始化得太小,那信号将在每层间传递时逐渐缩小而难以产生作用
- 深度学习模型的权重初始化得太大,那信号将在每层间传递时逐渐放大并导致发散和实效
xavier initialization满足:
- 均值为0
- 方差为
2/(nin+nout)
以下代码创建一个范围为(-根号(6/(nin+nout)),根号(6/(nin+nout)))
的均匀分布,其中fan_in是输入节点的数量,fan_out是输出节点的数量。
# 2.定义参数初始化方法xavier initialization
def xavier_init(fan_in, fan_out, constant = 1):
low = -constant * np.sqrt(6.0 / (fan_in + fan_out))
high = constant * np.sqrt(6.0 / (fan_in + fan_out))
return tf.random_uniform((fan_in,fan_out),
minval = low, maxval = high,
dtype = tf.float32)
# 返回fan_in * fan_out的矩阵,产生于low和high之间,产生的值是均匀分布的
第三步:定义一个去燥自编码的class
__init__函数包含这样几个输入:
- n_input:输入变量数
- n_hidden:隐藏层节点数
- transfer_function:隐含层激活函数,默认为softplus
- optimizer:优化器,默认为Adam
- scale:高斯噪声系数,默认为0.1