自编码器(AutoEncoder)

来源:互联网 发布:数据结构搜索算法 编辑:程序博客网 时间:2024/04/26 01:01

本文讲述自编码器(Auto Encoder,下文简称AE),将按照以下的思路展开讲解,力图使得初学者能看懂其中要义。目录如下:

       1.AE的基本原理

       2.AE的用途

       3.基于MNIST数据集的AE的简单python实现

1.AE的基本原理

      AE,是神经网络模型的一种,是一种全连接网络模型,而且进行无监督学习,下图是简单的AE结构。

          

     从上图可以看出AE模型主要由以下构建组成:

        1)编码器,即为输入层和第一个隐层之间的部分,主要进行特征提取,也称编码过程

        2)解码器,隐层到输出层之间部分,把隐层提取到的特征重新还原输出

      AE是相对简单的全连接模型,因为AE模型往往是对称的,也就是说编码过程和解码过程的网络组织是一样的,举个简单的例子:现有一5层的AE模型,若输入层神经元个数为200个,那么输出层神经元个数也是200个,第一个隐层有100个神经元,那么输出层的前一层也有100个神经元。AE模型的训练过程和全连接网络模型的训练过程是一样的。  

   

2.AE的应用场景

      我们学习一种算法,要明白算法的原理精髓,还要知道该算法的应用场景。AE的主要用途概括主要有两个:   A.特征提取,去燥,降维,信息补全;  B.为深层网络确定相对合理的网络初始化参数。下面对这两种用途做详细介绍。

      首先,AE是非常有效的数据降维模型,降维和信息补全对应了两种不同的网络架构,不严格的讲,隐层神经元个数少于输入层神经元个数,就认为该AE模型可以进行数据降维,AE的降维效果和著名的PCA(principal component analysis,主成分分析)降维算法有过之而无不及,PCA只能进行线性特征降维,而AE的范围就不仅局限于此了。隐层神经元个数若大于输入层神经元个数,这种AE模型是可以进行缺失信息填补的,至于去燥,现有的Denoising Autoencoder 模型就能够对原始数据进行去燥处理。

     再次,AE的另一个主要作用是为深层网络确定相对合理的网络初始化参数,了解深度学习的博友都知道,深层网络由于其网络层次往往较深,如果我们用随机化参数进行模型的训练,很多情况下会出现梯度消失或者梯度爆炸这样的情形,因此,如果能在深层模型训练之前给每一层的权值赋予相对合理对的权值,就能有效避免梯度消失和梯度爆炸问题。


3.基于MNIST数据集的AE的python实现

     前面我们介绍了AE的基本原理和应用场景,这里我们在MNIST数据集上用AE进行Python实现如下。

import osimport numpy as npimport tensorflow as tffrom tensorflow.examples.tutorials.mnist import input_dataimport matplotlib.pyplot as pltos.environ['TF_CPP_MIN_LOG_LEVEL']='2'#读取mnist数据集mnist=input_data.read_data_sets("MNIST_data",one_hot=True)input_num=784hidden_num=256learning_rate=0.01epoch=50batch_size=550example_to_show=5#权重字典weights={'encode_weight':tf.Variable(tf.truncated_normal([input_num,hidden_num])),        'decode_weight':tf.Variable(tf.truncated_normal([hidden_num,input_num]))}#偏置字典biases={'encode_bias':tf.Variable(tf.truncated_normal([hidden_num])),        'decode_bias':tf.Variable(tf.truncated_normal([input_num]))}input=tf.placeholder(tf.float32,[None,input_num])def encode(input):    return tf.nn.sigmoid(tf.add(tf.matmul(input, weights['encode_weight']),                                   biases['encode_bias']))def decode(input):    return tf.nn.sigmoid(tf.add(tf.matmul(input,weights['decode_weight']),                                biases['decode_bias']))#定义误差output=decode(encode(input))cost = tf.reduce_mean(tf.pow(input - output, 2))  # 最小二乘法optimizer = tf.train.AdamOptimizer(learning_rate).minimize(cost)#训练模型with tf.Session() as sess:    init=tf.global_variables_initializer()    sess.run(init)    total_batch = int(mnist.train.num_examples / batch_size)    print(total_batch)    for time in range(epoch):        for batch in range(total_batch):            batch_xs, batch_ys = mnist.train.next_batch(batch_size)  #获取需要用到的数据,y_batch不会用到            _, c = sess.run([optimizer, cost], feed_dict={input: batch_xs})        print("Epoch:",(time + 1), "cost=", round(c,6))    encode_decode = sess.run(        output, feed_dict={input: mnist.test.images[:example_to_show]})    f, a = plt.subplots(2, 5, figsize=(5, 2))    for i in range(example_to_show):        a[0][i].imshow(np.reshape(mnist.test.images[i], (28, 28)))        a[1][i].imshow(np.reshape(encode_decode[i], (28, 28)))    plt.show()
                            才疏学浅,不正确之处,欢迎指正!
参考:http://blog.csdn.net/u013719780/article/details/53788061

原创粉丝点击