Tensorflow学习笔记(二)实现降噪自动编码器--设计计算图

26 篇文章 5 订阅
11 篇文章 1 订阅

import numpy as np
import tensorflow as tf
import os
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'

#Xavier均匀初始化
'''
    如果网络的权重初始化太小,信号在层间传递时逐渐缩小会难以产生作用,如果权重初始化过大,那信号在层间传递时会被逐渐放大,最终导致发散。
    Xavier均匀初始化,这种权重初始化方法会根据某一层网络的输入输出节点数量自动调整最合适的随机分布,让初始化权重不大不小,正好合适。
    从数学的角度讲,就是让权重满足0均值,方差为2/(f_in+f_out),随机分布可以使均匀分布或者高斯分布。
    
'''
def xavier_init(f_in,f_out):
    low=-1*np.sqrt(6.0/(f_in+f_out))
    high=1*np.sqrt(6.0/(f_in+f_out))
    return tf.random_uniform((f_in,f_out),minval=low,maxval=high,dtype=tf.float32)   #建立了一个均匀分布

#加性高斯噪声的自动编码器
class AdditiveGaussianNoiseAutoencoder(object):
    def __init__(self, n_input, n_hidden,transfer_function=tf.nn.softplus,optimizer=tf.train.AdamOptimizer(),gauss_scale=0.1):
        #输入变量数
        self.n_input=n_input
        #隐藏层节点数
        self.n_hidden=n_hidden
        #隐藏层激活函数
        self.transfer_function=transfer_function
        #高斯噪声系数
        self.gauss_scale=gauss_scale
        #隐含层和重构层参数
        network_weights=self.init_wightes()
        self.weights=network_weights
        #输入信号
        self.x=tf.placeholder(tf.float32,[None,self.n_input])
        #隐藏层
        self.hidden=self.transfer_function(tf.add(tf.matmul(self.x+self.gauss_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_mean(tf.pow(tf.subtract(self.reconstruction,self.x),2))
        #优化器,用于减小损失
        self.optimizer=optimizer.minimize(self.cost)
        #初始化所有变量
        init=tf.global_variables_initializer()
        self.sess=tf.Session()
        self.sess.run(init)
        print('begin to run session')
    def init_wightes(self):
        #构建一个字典,存放所有要用到的w和b
        all_weights=dict()
        #对w1进行Xavier均匀初始化
        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
#实例化AdditiveGaussianNoiseAutoencoder类对象实例
AGN_AutoEncoder = AdditiveGaussianNoiseAutoencoder(n_input=784,
                                                   n_hidden=200,
                                                   transfer_function=tf.nn.softplus,
                                                   optimizer=tf.train.AdamOptimizer(learning_rate=0.01),
                                                   gauss_scale=0.01)
#把计算图写入事件文件,在TensorBoard里面查看
writer = tf.summary.FileWriter(logdir='logs', graph=AGN_AutoEncoder.sess.graph)
writer.close()

在tensorboard中查看计算图可以看到:


可以看到这个计算图比较杂乱无章,各个变量也没有名字,下一篇博客将对计算图进行美化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值