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中查看计算图可以看到: