tfautoencoder - juedaiyuer/researchNote GitHub Wiki

tensorflow实现自编码器

使用少量的基本特征组合拼装得到更高层抽象的特征,这就是特征的稀疏表达

如果我们有很多标记的数据,则可以训练一个深层的神经网络;如果没有标记的数据呢?可以使用无监督的自编码器来提取特征。

自编码器其实也是一种神经网络,它的输入和输出是一致的,它借助了稀疏编码的思想,目的是使用稀疏的一些高阶特征重新组合来重构自己。

通俗点的说法就是让一个人学习画一幅画,最后学到尽量和原作品一模一样,那么学习就成功了

1. AutoEncoder自动编码器

Deep Learning最简单的一种方法是利用人工神经网络的特点,人工神经网络(ANN)本身就是具有层次结构的系统,如果给定一个神经网络,我们假设其输出与输入是相同的,然后训练调整其参数,得到每一层中的权重。自然地,我们就得到了输入I的几种不同表示(每一层代表一种表示),这些表示就是特征。自动编码器就是一种尽可能复现输入信号的神经网络。为了实现这种复现,自动编码器就必须捕捉可以代表输入数据的最重要的因素,就像PCA那样,找到可以代表原信息的主要成分。

2. 参数初始化方法 xavier

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)

3. 去噪编码器函数

3.1 构建函数_init_

# 高斯噪声系数,默认为0.1
def __init__(self, n_input, n_hidden, transfer_function = tf.nn.softplus, optimizer = tf.train.AdamOptimizer(),
             scale = 0.1):
    self.n_input = n_input
    self.n_hidden = n_hidden
    self.transfer = transfer_function
    self.scale = tf.placeholder(tf.float32)
    self.training_scale = scale
    network_weights = self._initialize_weights()
    self.weights = network_weights

3.2 定义网络结构

# model
# 输入噪声 self.x + scale * tf.random_normal((n_input,))
# 激活函数处理 self.transfer
# 输出层的数据复原,重建操作,即建立reconstruction层
self.x = tf.placeholder(tf.float32, [None, self.n_input])
self.hidden = self.transfer(tf.add(tf.matmul(self.x + scale * tf.random_normal((n_input,)),
	self.weights['w1']),
	self.weights['b1']))
self.reconstruction = tf.add(tf.matmul(self.hidden, self.weights['w2']), self.weights['b2'])

3.3 损失函数

# cost
# 平方误差(Squared error)
# tf.subtract计算输出(self.reconstruction)与输入(self.x)之差
# tf.pow 计算差的平方
# tf.reduce_sum 求和得到平方误差

self.cost = 0.5 * tf.reduce_sum(tf.pow(tf.subtract(self.reconstruction, self.x), 2.0))
self.optimizer = optimizer.minimize(self.cost)

init = tf.global_variables_initializer()
self.sess = tf.Session()
self.sess.run(init)

3.4 初始化参数

def _initialize_weights(self):
    all_weights = dict()
    all_weights['w1'] = tf.Variable(xavier_init(self.n_input, self.n_hidden))
    all_weights['b1'] = tf.Variable(tf.zeros([self.n_hidden], dtype = tf.float32))
    all_weights['w2'] = tf.Variable(tf.zeros([self.n_hidden, self.n_input], dtype = tf.float32))
    all_weights['b2'] = tf.Variable(tf.zeros([self.n_input], dtype = tf.float32))
    return all_weights

3.5 训练步骤

也就是train_step

def partial_fit(self, X):
    cost, opt = self.sess.run((self.cost, self.optimizer), feed_dict = {self.x: X,
                                                                        self.scale: self.training_scale
                                                                        })
    return cost

3.6 隐藏层的输出结果

def transform(self, X):
    return self.sess.run(self.hidden, feed_dict = {self.x: X,
                                                   self.scale: self.training_scale
                                                   })

source