本节代码来自tensorflow的开源实现。
实现自编码器和实现一个单隐含层的神经网络差不多,只不过是在数据输入时做了标准化,并加上了一个高斯噪声,同时输出结果不是数字分类结果,而是复原的数据。
对于没有标注的数据,可以使用无监督的自编码器来提取特征,使用自身的高阶特征编码自己。可以使用自编码器对数据进行降维。自编码器的输入节点和输出节点的数量是一致的。
如果限制中间隐含层节点的数量,如让其小于输入/输出节点的数量,就相当于一个降维的过程。如给中间层的权重加一个L1正则,则可根据惩罚系数控制隐含节点的稀疏程度,惩罚系数越大,学到的特征组合越稀疏,实际使用的特征数量越少。
自编码器的隐含层的最主要功能就是学习出数据中的高阶特征。
自编码器作为一种无监督学习的方法,与其他无监督学习的主要不同在于,它不是对数据进行聚类,而是提取其中最有用,最频繁出现的高阶特征,根据这些高阶特征重构数据。
使用方法:
先用自编码器的方法进行无监督的预训练,提取特征并初始化权重,然后使用标注信息进行监督式的训练。当然,直接使用标注信息进行监督式的训练也行。
参数初始化方法:xavier
特点:根据某一层网络的输入,输出节点数量自动调整最合适的分布。Xaiver初始化器做的事情是:让权重被初始化得不大不小,正好合适。

# 给输入加上噪声
self.hidden = self.transfer(tf.add(tf.matmul(
self.x + scale * tf.random_normal((n_input,)),
self.weights['w1']),self.weights['b1']))
# 重建操作不需要激活函数

对数据进行标准化处理,标准化:让数据变成0均值,且标准差为1的分布。方法:先减去均值,再除以标准差。

import sklearn.preprocessing as prep
def standard_scale(X_train, X_test):
# 先在训练数据上fit出一个公用的Scaler,以保证模型处理数据时的一致性
preprocessor = prep.StandardScaler().fit(X_train)
X_train = preprocessor.transform(X_train)
X_test = preprocessor.transform(X_test)
return X_train, X_test
# 对训练集、测试集进行标准化变换