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

有关于自编码器的原理,请参考博客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_input
        self.n_hidden = n_hidden
        self.transfer = transfer_function
        self.scale = tf.placeholder(tf.float32) #定义成一个placeholder
        self.training_scale = scale
        network_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 = 1

autoencoder = 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 loss
        avg_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)))
时间: 2024-10-14 11:19:14

TensorFlow实现去噪自编码器及使用—Masking Noise Auto Encoder的相关文章

(翻译)deeplearning.net/tutorial —— 栈式去噪自编码器(SdA)

前言 栈式去噪自编码器是栈式自动编码器的扩展[Bengio07],并且它在[Vincent08]里有介绍. 这次教程建立在之前的去噪自编码器Denoising Autoencoders.如果你对自编码器没什么了解,建议你先了解一下. 栈式自编码器 通过把上一层去噪自编码器找到的隐藏输入(output code)当作下一层的输入,我们可以把去噪自编码器以栈的形式构成一个深度网络.这种无监督预训练的结构在一层里同时实现.每一层当作一个去噪自编码器,通过重构输入(上一层的输出)最小化损失.一旦前面 层

自编码器和去噪自编码器的可视化

自编码器和去噪自编码器 Denoising Autoencoders (dA) Autoencoders Denoising Autoencoders Putting it All Together Running the Code Stacked Denoising Autoencoders (SdA) Stacked Autoencoders Putting it all together Running the Code Tips and Tricks 可视化 转自: [1] https:

[自编码器] [稀疏自编码器] Auto Encoder原理详解

自编码器是一种有效的提取特征的方法,与PCA无监督降维不同,它实际上是独立于有监督.无监督算法外的自监督算法,Hinton大牛主要就是搞这块的,比如被他当做宝贝的玻尔兹曼机... 下面这个PPT主要讲一下自编码器的原理及其变种. 原文地址:https://www.cnblogs.com/virter/p/9547520.html

『TensorFlow』读书笔记_降噪自编码器

『TensorFlow』降噪自编码器设计 之前学习过的代码,又敲了一遍,新的收获也还是有的,因为这次注释写的比较详尽,所以再次记录一下,具体的相关知识查阅之前写的文章即可(见上面链接). # Author : Hellcat # Time : 2017/12/6 import numpy as np import sklearn.preprocessing as prep import tensorflow as tf from tensorflow.examples.tutorials.mni

PyTorch实例:基于自编码器的图形去噪

去噪自编码器模拟人类视觉机制能够自动忍受图像的噪声来识别图片.自编码器的目标是要学习一个近似的恒等函数,使得输出近似等于输入.去噪自编码器采用随机的部分带噪输入来解决恒等函数问题,自编码器能够获得输入的良好表征,该表征使得自编码器能进行去噪或恢复. 下面是代码: #加载库和配置参数 #去噪自编码器 import torch import torch.nn as nn import torch.utils as utils from torch.autograd import Variable i

学习笔记TF025:自编码器

传统机器学习依赖良好的特征工程.深度学习解决有效特征难人工提取问题.无监督学习,不需要标注数据,学习数据内容组织形式,提取频繁出现特征,逐层抽象,从简单到复杂,从微观到宏观. 稀疏编码(Sparse Coding),基本结构组合.自编码器(AutoEncoder),用自身高阶特征编码自己.期望输入/输出一致,使用高阶特征重构自己. Hinton教授在Science发表文章<Reducing the dimensionality of data with neural networks>,讲解自

TensorFlow实战--阅读笔记part2

一.Tensorflow编译安装 推荐使用Anaconda作为python环境,可以避免大量的兼容性问题 tensorflow安装过程 以在服务器上安装为例(linux) 1.在anaconda官网上下载与自己机器对应的版本 下载.sh形式的文件 2.在anaconda下载目录中输入以下路径(下载的文件名可能不同) $ bash Anaconda-4.2.0-Linux-x86_64.sh 3. 安装tensorflow-cpu版本  如果要安装gpu,请跳到第4步 推荐安装编译好的releas

降噪自编码器/稀疏自编码器/栈式自编码器

漫谈autoencoder:降噪自编码器/稀疏自编码器/栈式自编码器(含tensorflow实现) 2018年08月11日 20:45:14 wblgers1234 阅读数 13196更多 分类专栏: 机器学习 深度学习 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/wblgers1234/article/details/81545079 0. 前言   在非监督学习中,最典型的一类神经

TensorFlow文本摘要生成 - 基于注意力的序列到序列模型

1 相关背景 维基百科对自动摘要生成的定义是, "使用计算机程序对一段文本进行处理, 生成一段长度被压缩的摘要, 并且这个摘要能保留原始文本的大部分重要信息". 摘要生成算法主要分为抽取型(Extraction-based)和概括型(Abstraction-based)两类. 传统的摘要生成系统大部分都是抽取型的, 这类方法从给定的文章中, 抽取关键的句子或者短语, 并重新拼接成一小段摘要, 而不对原本的内容做创造性的修改. 这类抽取型算法工程上已经有很多开源的解决办法了, 例如Git