TensorFlow实现AutoEncoder自编码器

一、概述

AutoEncoder大致是一个将数据的高维特征进行压缩降维编码,再经过相反的解码过程的一种学习方法。学习过程中通过解码得到的最终结果与原数据进行比较,通过修正权重偏置参数降低损失函数,不断提高对原数据的复原能力。学习完成后,前半段的编码过程得到结果即可代表原数据的低维“特征值”。通过学习得到的自编码器模型可以实现将高维数据压缩至所期望的维度,原理与PCA相似。

二、模型实现

1. AutoEncoder

首先在MNIST数据集上,实现特征压缩和特征解压并可视化比较解压后的数据与原数据的对照。

先看代码:

import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt 

# 导入MNIST数据
from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets("MNIST_data/", one_hot=False) 

learning_rate = 0.01
training_epochs = 10
batch_size = 256
display_step = 1
examples_to_show = 10
n_input = 784 

# tf Graph input (only pictures)
X = tf.placeholder("float", [None, n_input]) 

# 用字典的方式存储各隐藏层的参数
n_hidden_1 = 256 # 第一编码层神经元个数
n_hidden_2 = 128 # 第二编码层神经元个数
# 权重和偏置的变化在编码层和解码层顺序是相逆的
# 权重参数矩阵维度是每层的 输入*输出,偏置参数维度取决于输出层的单元数
weights = {
 'encoder_h1': tf.Variable(tf.random_normal([n_input, n_hidden_1])),
 'encoder_h2': tf.Variable(tf.random_normal([n_hidden_1, n_hidden_2])),
 'decoder_h1': tf.Variable(tf.random_normal([n_hidden_2, n_hidden_1])),
 'decoder_h2': tf.Variable(tf.random_normal([n_hidden_1, n_input])),
}
biases = {
 'encoder_b1': tf.Variable(tf.random_normal([n_hidden_1])),
 'encoder_b2': tf.Variable(tf.random_normal([n_hidden_2])),
 'decoder_b1': tf.Variable(tf.random_normal([n_hidden_1])),
 'decoder_b2': tf.Variable(tf.random_normal([n_input])),
} 

# 每一层结构都是 xW + b
# 构建编码器
def encoder(x):
 layer_1 = tf.nn.sigmoid(tf.add(tf.matmul(x, weights['encoder_h1']),
         biases['encoder_b1']))
 layer_2 = tf.nn.sigmoid(tf.add(tf.matmul(layer_1, weights['encoder_h2']),
         biases['encoder_b2']))
 return layer_2 

# 构建解码器
def decoder(x):
 layer_1 = tf.nn.sigmoid(tf.add(tf.matmul(x, weights['decoder_h1']),
         biases['decoder_b1']))
 layer_2 = tf.nn.sigmoid(tf.add(tf.matmul(layer_1, weights['decoder_h2']),
         biases['decoder_b2']))
 return layer_2 

# 构建模型
encoder_op = encoder(X)
decoder_op = decoder(encoder_op) 

# 预测
y_pred = decoder_op
y_true = X 

# 定义代价函数和优化器
cost = tf.reduce_mean(tf.pow(y_true - y_pred, 2)) #最小二乘法
optimizer = tf.train.AdamOptimizer(learning_rate).minimize(cost) 

with tf.Session() as sess:
 # tf.initialize_all_variables() no long valid from
 # 2017-03-02 if using tensorflow >= 0.12
 if int((tf.__version__).split('.')[1]) < 12 and int((tf.__version__).split('.')[0]) < 1:
  init = tf.initialize_all_variables()
 else:
  init = tf.global_variables_initializer()
 sess.run(init)
 # 首先计算总批数,保证每次循环训练集中的每个样本都参与训练,不同于批量训练
 total_batch = int(mnist.train.num_examples/batch_size) #总批数
 for epoch in range(training_epochs):
  for i in range(total_batch):
   batch_xs, batch_ys = mnist.train.next_batch(batch_size) # max(x) = 1, min(x) = 0
   # Run optimization op (backprop) and cost op (to get loss value)
   _, c = sess.run([optimizer, cost], feed_dict={X: batch_xs})
  if epoch % display_step == 0:
   print("Epoch:", '%04d' % (epoch+1), "cost=", "{:.9f}".format(c))
 print("Optimization Finished!") 

 encode_decode = sess.run(
  y_pred, feed_dict={X: mnist.test.images[:examples_to_show]})
 f, a = plt.subplots(2, 10, figsize=(10, 2))
 for i in range(examples_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()

代码解读:

首先,导入将要使用到的各种库和数据集,定义各个参数如学习率、训练迭代次数等,清晰明了便于后期修改。由于自编码器的神经网络结构非常有规律性,都是xW + b的结构,故将每一层的权重W和偏置b的变量tf.Variable统一置于一个字典中,通过字典的key值更加清晰明了的描述。模型构建思路上,将编码器部分和解码器部分分开构建,每一层的激活函数使用Sigmoid函数,编码器通常与编码器使用同样的激活函数。通常编码器部分和解码器部分是一个互逆的过程,例如我们设计将784维降至256维再降至128维的编码器,解码器对应的就是从128维解码至256维再解码至784维。定义代价函数,代价函数表示为解码器的输出与原始输入的最小二乘法表达,优化器采用AdamOptimizer训练阶段每次循环将所有的训练数据都参与训练。经过训练,最终将训练结果与原数据可视化进行对照,如下图,还原度较高。如果增大训练循环次数或者增加自编码器的层数,可以得到更好的还原效果。

运行结果:


2. Encoder

Encoder编码器工作原理与AutoEncoder相同,我们将编码得到的低维“特征值”在低维空间中可视化出来,直观显示数据的聚类效果。具体地说,将784维的MNIST数据一步步的从784到128到64到10最后降至2维,在2维坐标系中展示遇上一个例子不同的是,在编码器的最后一层中我们不采用Sigmoid激活函数,而是将采用默认的线性激活函数,使输出为(-∞,+∞)。

完整代码:

import tensorflow as tf
import matplotlib.pyplot as plt 

from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets("MNIST_data/", one_hot=False) 

learning_rate = 0.01
training_epochs = 10
batch_size = 256
display_step = 1
n_input = 784
X = tf.placeholder("float", [None, n_input]) 

n_hidden_1 = 128
n_hidden_2 = 64
n_hidden_3 = 10
n_hidden_4 = 2
weights = {
 'encoder_h1': tf.Variable(tf.truncated_normal([n_input, n_hidden_1],)),
 'encoder_h2': tf.Variable(tf.truncated_normal([n_hidden_1, n_hidden_2],)),
 'encoder_h3': tf.Variable(tf.truncated_normal([n_hidden_2, n_hidden_3],)),
 'encoder_h4': tf.Variable(tf.truncated_normal([n_hidden_3, n_hidden_4],)),
 'decoder_h1': tf.Variable(tf.truncated_normal([n_hidden_4, n_hidden_3],)),
 'decoder_h2': tf.Variable(tf.truncated_normal([n_hidden_3, n_hidden_2],)),
 'decoder_h3': tf.Variable(tf.truncated_normal([n_hidden_2, n_hidden_1],)),
 'decoder_h4': tf.Variable(tf.truncated_normal([n_hidden_1, n_input],)),
}
biases = {
 'encoder_b1': tf.Variable(tf.random_normal([n_hidden_1])),
 'encoder_b2': tf.Variable(tf.random_normal([n_hidden_2])),
 'encoder_b3': tf.Variable(tf.random_normal([n_hidden_3])),
 'encoder_b4': tf.Variable(tf.random_normal([n_hidden_4])),
 'decoder_b1': tf.Variable(tf.random_normal([n_hidden_3])),
 'decoder_b2': tf.Variable(tf.random_normal([n_hidden_2])),
 'decoder_b3': tf.Variable(tf.random_normal([n_hidden_1])),
 'decoder_b4': tf.Variable(tf.random_normal([n_input])),
}
def encoder(x):
 layer_1 = tf.nn.sigmoid(tf.add(tf.matmul(x, weights['encoder_h1']),
         biases['encoder_b1']))
 layer_2 = tf.nn.sigmoid(tf.add(tf.matmul(layer_1, weights['encoder_h2']),
         biases['encoder_b2']))
 layer_3 = tf.nn.sigmoid(tf.add(tf.matmul(layer_2, weights['encoder_h3']),
         biases['encoder_b3']))
 # 为了便于编码层的输出,编码层随后一层不使用激活函数
 layer_4 = tf.add(tf.matmul(layer_3, weights['encoder_h4']),
         biases['encoder_b4'])
 return layer_4 

def decoder(x):
 layer_1 = tf.nn.sigmoid(tf.add(tf.matmul(x, weights['decoder_h1']),
         biases['decoder_b1']))
 layer_2 = tf.nn.sigmoid(tf.add(tf.matmul(layer_1, weights['decoder_h2']),
         biases['decoder_b2']))
 layer_3 = tf.nn.sigmoid(tf.add(tf.matmul(layer_2, weights['decoder_h3']),
        biases['decoder_b3']))
 layer_4 = tf.nn.sigmoid(tf.add(tf.matmul(layer_3, weights['decoder_h4']),
        biases['decoder_b4']))
 return layer_4 

encoder_op = encoder(X)
decoder_op = decoder(encoder_op) 

y_pred = decoder_op
y_true = X 

cost = tf.reduce_mean(tf.pow(y_true - y_pred, 2))
optimizer = tf.train.AdamOptimizer(learning_rate).minimize(cost) 

with tf.Session() as sess:
 # tf.initialize_all_variables() no long valid from
 # 2017-03-02 if using tensorflow >= 0.12
 if int((tf.__version__).split('.')[1]) < 12 and int((tf.__version__).split('.')[0]) < 1:
  init = tf.initialize_all_variables()
 else:
  init = tf.global_variables_initializer()
 sess.run(init)
 total_batch = int(mnist.train.num_examples/batch_size)
 for epoch in range(training_epochs):
  for i in range(total_batch):
   batch_xs, batch_ys = mnist.train.next_batch(batch_size) # max(x) = 1, min(x) = 0
   _, c = sess.run([optimizer, cost], feed_dict={X: batch_xs})
  if epoch % display_step == 0:
   print("Epoch:", '%04d' % (epoch+1), "cost=", "{:.9f}".format(c))
 print("Optimization Finished!") 

 encoder_result = sess.run(encoder_op, feed_dict={X: mnist.test.images})
 plt.scatter(encoder_result[:, 0], encoder_result[:, 1], c=mnist.test.labels)
 plt.colorbar()
 plt.show()

实验结果:

由结果可知,2维编码特征有较好的聚类效果,图中每个颜色代表了一个数字,聚集性很好。

当然,本次实验所得到的结果只是对AutoEncoder做一个简单的介绍,要想得到期望的效果,还应该设计更加复杂的自编码器结构,得到区分性更好的特征。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

您可能感兴趣的文章:

  • 利用c语言实现卷积码编码器示例
  • Python使用base64模块进行二进制数据编码详解
  • 浅谈Python2获取中文文件名的编码问题
  • python中判断文件编码的chardet(实例讲解)
  • python 设置文件编码格式的实现方法
  • Python 查看文件的编码格式方法
(0)

相关推荐

  • Python 查看文件的编码格式方法

    在读取中文的情况下,通常会遇到一些编码的问题,但是首先需要了解目前的编码方式是什么,然后再用decode或者encode去编码和解码,下面是使用chardet库来查看编码方式的. import chardet path = "E:/t.csv" #path = "E:/t.zip" f = open(path,'rb') data = f.read() print(chardet.detect(data)) 打印结果如下: {'encoding': 'GB2312'

  • 浅谈Python2获取中文文件名的编码问题

    问题: Python2获取包含中文的文件名是如果不转码会出现乱码. 这里假设要测试的文件夹名为test,文件夹下有5个文件名包含中文的文件分别为: Python性能分析与优化.pdf Python数据分析与挖掘实战.pdf Python编程实战:运用设计模式.并发和程序库创建高质量程序.pdf 流畅的Python.pdf 编写高质量Python代码的59个有效方法.pdf 我们先不转码直接打印获取到的文件名,代码如下: import os for file in os.listdir('./te

  • python中判断文件编码的chardet(实例讲解)

    1.实测,这个版本在32位window7和python3.2环境下正常使用. 2.使用方法:把解压后所得的chardet和docs两个文件夹拷贝到python3.2目录下的Lib\site-packages目录下就可以正常使用了. 3.判断文件编码的参考代码如下: file = open(fileName, "rb")#要有"rb",如果没有这个的话,默认使用gbk读文件. buf = file.read() result = chardet.detect(buf)

  • python 设置文件编码格式的实现方法

    如果要在python2的py文件里面写中文,则必须要添加一行声明文件编码的注释,否则python2会默认使用ASCII编码.(python3已经没有这个问题了,python3默认的文件编码是UTF-8) 必须将编码注释放在第一行或者第二行,一般来说,Python文件的前两行要这样写: #!/usr/bin/python # -*- coding: UTF-8 -*- 其中第一行是指定python解释器,第二行是指定python文件编码方式,设置编码方式有以下可选的方法 1. 带等号的设置方法:

  • 利用c语言实现卷积码编码器示例

    实现(2, 1, 7)卷积码编码信息序列1001 1010 1111 1100生成序列g1 = 1011011;g2 = 1111001初始状态全0.以上参数可自行在main中修改. 复制代码 代码如下: /***This is an simple example program of convolutional encoder.   *The information sequence, the register initial states and the generation sequenc

  • Python使用base64模块进行二进制数据编码详解

    前言 昨天团队的学妹来问关于POP3协议的问题,所以今天稍稍研究了下POP3协议的格式和Python里面的poplib.而POP服务器往回传的数据里有一部分需要用到Base64进行解码,所以就顺便看了下Python里面的base64模块. 本篇先讲一下base64模块,该模块提供了关于Base16,Base32,Base64,Base85和Ascii85的编码和解码相关的函数.有关poplib模块的内容,会在后面发上来.嗯,又挖了一个坑,这辈子挖的坑填不完了... 以下内容摘自http://bb

  • TensorFlow实现AutoEncoder自编码器

    一.概述 AutoEncoder大致是一个将数据的高维特征进行压缩降维编码,再经过相反的解码过程的一种学习方法.学习过程中通过解码得到的最终结果与原数据进行比较,通过修正权重偏置参数降低损失函数,不断提高对原数据的复原能力.学习完成后,前半段的编码过程得到结果即可代表原数据的低维"特征值".通过学习得到的自编码器模型可以实现将高维数据压缩至所期望的维度,原理与PCA相似. 二.模型实现 1. AutoEncoder 首先在MNIST数据集上,实现特征压缩和特征解压并可视化比较解压后的数

  • python神经网络使用tensorflow实现自编码Autoencoder

    目录 学习前言 antoencoder简介 1.为什么要降维 2.antoencoder的原理 3.python中encode的实现 全部代码 学习前言 当你发现数据的维度太多怎么办!没关系,我们给它降维!当你发现不会降维怎么办!没关系,来这里看看怎么autoencode antoencoder简介 1.为什么要降维 随着社会的发展,可以利用人工智能解决的越来越多,人工智能所需要处理的问题也越来越复杂,作为神经网络的输入量,维度也越来越大,也就出现了当前所面临的“维度灾难”与“信息丰富.知识贫乏

  • Keras搭建自编码器操作

    简介: 传统机器学习任务任务很大程度上依赖于好的特征工程,但是特征工程往往耗时耗力,在视频.语音和视频中提取到有效特征就更难了,工程师必须在这些领域有非常深入的理解,并且需要使用专业算法提取这些数据的特征.深度学习则可以解决人工难以提取有效特征的问题,大大缓解机器学习模型对特征工程的依赖. 深度学习在早期一度被认为是一种无监督的特征学习过程,模仿人脑对特征逐层抽象的过程.这其中两点很重要:一是无监督学习:二是逐层训练.例如在图像识别问题中,假定我们有许多汽车图片,要如何利用计算机进行识别任务呢?

  • Tensorflow 2.4 搭建单层和多层 Bi-LSTM 模型

    目录 前言 实现过程 1. 获取数据 2. 处理数据 3. 单层 Bi-LSTM 模型 4. 多层 Bi-LSTM 模型 前言 本文使用 cpu 版本的 TensorFlow 2.4 ,分别搭建单层 Bi-LSTM 模型和多层 Bi-LSTM 模型完成文本分类任务. 确保使用 numpy == 1.19.0 左右的版本,否则在调用 TextVectorization 的时候可能会报 NotImplementedError . 实现过程 1. 获取数据 (1)我们本文用到的数据是电影的影评数据,每

  • Tensorflow简单验证码识别应用

    简单的Tensorflow验证码识别应用,供大家参考,具体内容如下 1.Tensorflow的安装方式简单,在此就不赘述了. 2.训练集训练集以及测试及如下(纯手工打造,所以数量不多): 3.实现代码部分(参考了网上的一些实现来完成的) main.py(主要的神经网络代码) from gen_check_code import gen_captcha_text_and_image_new,gen_captcha_text_and_image from gen_check_code import

  • TensorFlow安装及jupyter notebook配置方法

    tensorflow利用anaconda在ubuntu下安装方法及jupyter notebook运行目录及远程访问配置 Ubuntu下安装Anaconda bash ~/file_path/file_name.sh 出现许可后可按Ctrl+C跳过,yes同意. 安装完成后询问是否加入path路径,亦可自行修改文件内容 关闭命令台重开 python -V 可查看是否安装成功 修改anaconda的python版本,以符合tf要求 conda install python=3.5 Anaconda

  • 世界杯用Windows Media编码器建网络电视直播站

    阿萌:在网上看电视早不是什么稀罕事,但是大多数的传输速度实在不敢恭维,遇到现场直播的时候往往看不到好的效果.其实利用电视卡.Windows Media 编码器以及Windows Media Player,就可以让你通过网络高速收看现场直播节目了! 一. 通过Windows Media编码器组建共享电视节目中心 Windows Media编码器与Windows Media Player就像一对孪生姐妹,Windows Media编码器是微软公司的媒体制作软件,能够实现组建在线电台和在线视频直播等功

  • 使用tensorflow实现AlexNet

    AlexNet是2012年ImageNet比赛的冠军,虽然过去了很长时间,但是作为深度学习中的经典模型,AlexNet不但有助于我们理解其中所使用的很多技巧,而且非常有助于提升我们使用深度学习工具箱的熟练度.尤其是我刚入门深度学习,迫切需要一个能让自己熟悉tensorflow的小练习,于是就有了这个小玩意儿...... 先放上我的代码:https://github.com/hjptriplebee/AlexNet_with_tensorflow 如果想运行代码,详细的配置要求都在上面链接的rea

  • TensorFlow在MAC环境下的安装及环境搭建

    给大家分享一下TensorFlow在MAC系统中的安装步骤以及环境搭建的操作流程. TensorFlow 底层的图模型结构清晰,容易改造:支持分布式训练:可视化效果好.如果做长期项目,接触较大数据集的话,TensorFlow很适用,而且谷歌也在不断优化完备它,对于使用深度学习朋友,TensorFlow是一个很好的工具. 在学习了一段时间台大李宏毅关于deep learning的课程,以及一些其他机器学习的书之后,终于打算开始动手进行一些实践了. 感觉保完研之后散养状态下,学习效率太低了,于是便想

  • python tensorflow基于cnn实现手写数字识别

    一份基于cnn的手写数字自识别的代码,供大家参考,具体内容如下 # -*- coding: utf-8 -*- import tensorflow as tf from tensorflow.examples.tutorials.mnist import input_data # 加载数据集 mnist = input_data.read_data_sets('MNIST_data', one_hot=True) # 以交互式方式启动session # 如果不使用交互式session,则在启动s

随机推荐