有关于自编码器的原理,请参考博客http://blog.csdn.net/xukaiwen_2016/article/details/70767518;对于对其与原理熟悉的可以直接看下面代码。

首先是使用到的相关库,数学运算相关操作库Numpy和对数据进行预处理的模块Scikit-lean中的preprocessing,使用TensorFlow的MNIST作为数据集。

import numpy as np
import sklearn.preprocessing as prep
import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data

我们知道自编码器最重要的就是求出输入层到数据量较少的隐含层之间的映射矩阵,而这个矩阵是需要初始化的,对于我们的深度学习模型来说,这个矩阵里的初始化数据要尽可能的大小合适,均匀或高斯分布。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)

接下来定义一个自编码器的class方便我们重复使用,其中包含_init_()构造函数以及多个成员函数。

首先是_init_()构造函数,参数:n_input(输入变量数),n_hidden(隐含层变量数),transfer_function(隐含层激活函数,默认softplus),optimizer(优化器,默认为Adam),scale(高斯噪声系数,默认0.1)。_initialize_weights()在之后定义,完成映射矩阵以及偏置向量。

def __init__(self, n_input, n_hidden, transfer_function = tf.nn.softplus, optimizer = tf.train.AdamOptimizer(),scale = 0.1):self.n_input = n_inputself.n_hidden = n_hiddenself.transfer = transfer_functionself.scale = tf.placeholder(tf.float32) #定义成一个placeholderself.training_scale = scalenetwork_weights = self._initialize_weights()self.weights = network_weights# 定义模型,也就是输入层,隐含层,输出层以及之间的映射矩阵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'])# 定义损失函数,这里我们使用平方差,因为下面的激活函数选择的是恒等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)

_initialize_weights()完成映射矩阵以及偏置向量,里面调用了之前的xavier_init函数。

    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))# 隐含层到输出层矩阵,可以看出是w1的逆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

partial_fit()使用batch进行训练的函数,训练时使用六cost和optimizer,feed_dict喂数据,包括输入数据和高斯噪声系数。

    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

calc_total_cost()为只求损失不进行损失极小化操作,只执行cost

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

transform()根据输入获取其隐含层数据。

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

generate()根据隐含层数据获取输出层数据。

    def generate(self, hidden = None):if hidden is None:hidden = np.random.normal(size = self.weights["b1"])return self.sess.run(self.reconstruction, feed_dict = {self.hidden: hidden})

reconstruct()根据输入层数据获取输出层数据,相当于transform()+generate()。

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

接下来的就是获取映射矩阵和偏置向量。

    def getWeights(self):return self.sess.run(self.weights['w1'])def getBiases(self):return self.sess.run(self.weights['b1'])

以上就是自编码器class的完整定义。

读取数据集

mnist = input_data.read_data_sets('MNIST_data', one_hot = True)

standard_scale()对输入的图片数据和测试数据进行标准化,也就是让图片的像素值映射到0-1空间,这个时候我们需要使用sklearn.preprocessing中的StandardScaler。

def standard_scale(X_train, X_test):preprocessor = prep.StandardScaler().fit(X_train)X_train = preprocessor.transform(X_train)X_test = preprocessor.transform(X_test)return X_train, X_test

get_random_block_from_data()随机获取若干图片,我们不是把MNIST中所有数据进行训练。

def get_random_block_from_data(data, batch_size):start_index = np.random.randint(0, len(data) - batch_size)return data[start_index:(start_index + batch_size)]

最后就是进行训练了,下面的代码应该很熟悉了,也很简单,不再多说,直接贴出剩下的全部代码:

X_train, X_test = standard_scale(mnist.train.images, mnist.test.images)n_samples = int(mnist.train.num_examples)
training_epochs = 20
batch_size = 128
display_step = 1autoencoder = AdditiveGaussianNoiseAutoencoder(n_input = 784,n_hidden = 200,transfer_function = tf.nn.softplus,optimizer = tf.train.AdamOptimizer(learning_rate = 0.001),scale = 0.01)for epoch in range(training_epochs):avg_cost = 0.total_batch = int(n_samples / batch_size)# 循环载入训练数据for i in range(total_batch):batch_xs = get_random_block_from_data(X_train, batch_size)# 使用batch喂入训练数据cost = autoencoder.partial_fit(batch_xs)# Compute average lossavg_cost += cost / n_samples * batch_size# 展示损失if epoch % display_step == 0:print("Epoch:", '%04d' % (epoch + 1), "cost=", "{:.9f}".format(avg_cost))print("Total cost: " + str(autoencoder.calc_total_cost(X_test)))

TensorFlow实现去噪自编码器及使用—Masking Noise Auto Encoder相关推荐

  1. TensorFlow实现去噪自编码器(Denoising Autoencoder)

    TensorFlow实现去噪自编码器(Denoising Autoencoder) 去噪自编码器(Denoising Autoencoder, DAE) DAE模型架构 DAE实现 数据预处理 模型构 ...

  2. tensorflow 卷积、反卷积形式的去噪自编码器

    tensorflow 卷积.反卷积形式的去噪自编码器 对于去噪自编码器,网上好多都是利用全连接神经网络进行构建,我自己写了一个卷积.反卷积形式的去噪自编码器,其中的参数调优如果有兴趣的话,可以自行修改 ...

  3. 【theano-windows】学习笔记十三——去噪自编码器

    前言 上一章节学习了卷积的写法,主要注意的是其实现在theano.tensor.nnet和theano.sandbox.cuda.dnn中都有对应函数实现, 这一节就进入到无监督或者称为半监督的网络构 ...

  4. 【TensorFlow-windows】(二) 实现一个去噪自编码器

    主要内容: 1.自编码器的TensorFlow实现代码(详细代码注释) 2.该实现中的函数总结 平台: 1.windows 10 64位 2.Anaconda3-4.2.0-Windows-x86_6 ...

  5. [自编码器:理论+代码]:自编码器、栈式自编码器、欠完备自编码器、稀疏自编码器、去噪自编码器、卷积自编码器

    写在前面 因为时间原因本文有些图片自己没有画,来自网络的图片我尽量注出原链接,但是有的链接已经记不得了,如果有使用到您的图片,请联系我,必注释. 自编码器及其变形很多,本篇博客目前主要基于普通自编码器 ...

  6. ICLR 2020:从去噪自编码器到生成模型

    作者丨苏剑林 单位丨追一科技 研究方向丨NLP,神经网络 个人主页丨kexue.fm 在我看来,几大顶会之中,ICLR 的论文通常是最有意思的,因为它们的选题和风格基本上都比较轻松活泼.天马行空,让人 ...

  7. SDAE-stacked denoised autoencoder (堆栈去噪自编码器)

    堆栈自编码器 Stacked AutoEncoder_浮生了大白的博客-CSDN博客_堆栈自编码器 为什么稀疏自编码器很少见到多层的? - 知乎 Based on blog which links w ...

  8. 基于粒子群优化堆叠去噪自编码器(PSO-SDAE)的时间序列预测

    基于粒子群优化堆叠去噪自编码器(PSO-SDAE)的时间序列预测 优化参数为学习率,隐藏层节点个数,最大训练次数 matlab代码 ID:69100673407358242

  9. 正则自编码器之去噪自编码器

    图1.自编码器的一般结构 传统自编码器通过最小化如下目标:                                                   (公式1) 公式1中L是一个损失函数,惩 ...

  10. 自编码器(Auto Encoder)原理及其python实现

    目录 一.原理 二.为什么要使用自编码器 三.代码实现 1.原始自编码器 2.多层(堆叠)自编码器 3.卷积自编码器 4.正则自编码器 4.1稀疏自编码器 四.降噪自编码器 五. 逐层贪婪训练堆叠自编 ...

最新文章

  1. php博客浏览人数,在博客中实现浏览次数的统计
  2. UC浏览器代理流量解密
  3. 使用js实现放大镜效果
  4. python 使用进程池Pool进行并发编程
  5. Android开源框架源码鉴赏:Fresco
  6. 《江湖X:汉家江湖》两万人在线服务器架构
  7. C# 系统应用之ListView控件 (二).加载选中节点文件夹下文件信息
  8. Ray集群搭建 Python Demo
  9. python是开源的它可以被移植到许多平台上对吗_Python程序设计答案
  10. 聪明人自动焊锡机器人_使用自动焊锡机的优势有哪些?
  11. 上海市二级c语言软件环境,上海市2019年9月计算机二级考试复习教程:(C语言)上机考试新版题库+全真模拟试卷(2本装)...
  12. 学习Android逆向
  13. matlab运算放大器概述,运算放大器概述
  14. 计算机触摸板设置方法,笔记本触摸板设置教程详解!笔记本触控怎么打开设置...
  15. 2022最推荐的四款免费bi工具
  16. ask调制流程图_利用卷积神经网络的自动调制分类算法
  17. Failed to execute goal org.apache.maven.plugins:maven-surefire-plugin:2.17:test (default-test) on pr
  18. 致那些奋斗的青春岁月(上)
  19. Final阶段基于NABCD评论作品
  20. 1.8.5 访问日志不记录静态文件

热门文章

  1. MAC编译库的路径问题rpath/install_name
  2. JDK绘制文字的流程与代码分析
  3. CheerpJ调用的两种方式
  4. LINUX下载编译FreeSwitch
  5. 又漏了一张发票,所以报销要及时
  6. 携号转网不会有多大影响
  7. 解决办法: error: passing ‘const VideoFrame’ as ‘this’ argument discards qualifiers [-fpermissive]
  8. 手机WIFI的上行下行速度不同
  9. 1971年中国的预警机就上天了
  10. linux下物理内存不足,vm中linux物理内存不足解决方案