## TensorFlow神经网络优化策略学习

| |
[ 所属分类 开发（python） | 发布者 店小二04 | 时间 | 作者 红领巾 ] 0人收藏点击收藏

tf.train.exponential_decay(learning_rate, global_step, decay_steps, decay_rate,staircase=False, name=None)

1. 过拟合问题及其解决方法

2. 过拟合问题的TensorFlow解决方案

loss =tf.reduce_mean(tf.square(y_ - y) + tf.contrib.layers.l2_regularizer(lambda)(w)

# 比较L1正则化和L2正则化函数的作用效果
w = tf.constant([[1.0, -2.0], [-3.0, 4.0]])
with tf.Session() as sess:
# 0.5*(|1|+|-2|+|-3|+|4|=5.0)
print(sess.run(tf.contrib.layers.l1_regularizer(0.5)(w))) # 5.0
# 0.5*[(1+4+9+16)/2]=7.5 TensorFlow会将L2正则化项除以2使得求导的结果更简洁
print(sess.run(tf.contrib.layers.l2_regularizer(0.5)(w))) # 7.5

1. 复杂神经网络结构权重L2正则化方法

import tensorflow as tf

'''''
# 比较L1正则化和L2正则化函数的作用效果
w = tf.constant([[1.0, -2.0], [-3.0, 4.0]])
with tf.Session() as sess:
# 0.5*(|1|+|-2|+|-3|+|4|=5.0)
print(sess.run(tf.contrib.layers.l1_regularizer(0.5)(w))) # 5.0
# 0.5*[(1+4+9+16)/2]=7.5 TensorFlow会将L2正则化项除以2使得求导的结果更简洁
print(sess.run(tf.contrib.layers.l2_regularizer(0.5)(w))) # 7.5
'''

# 复杂神经网络结构权重L2正则化方法
# 定义各层的权重，并将该权重的L2正则化项加入至名称为‘losses'的集合
def get_weight(shape, lambda1):
var = tf.Variable(tf.random_normal(shape), dtype=tf.float32)
return var

x = tf.placeholder(tf.float32, (None, 2))
y_ = tf.placeholder(tf.float32, (None, 1))

layer_dimension = [2,10,5,3,1] # 定义了神经网络每层的节点数
n_layers = len(layer_dimension)

current_layer = x # 将当前层设置为输入层
in_dimension = layer_dimension[0]

# 通过循环生成一个5层全连接的神经网络结构
for i in range(1,n_layers):
out_dimension = layer_dimension[i]
weight = get_weight([in_dimension,out_dimension], 0.003)
bias = tf.Variable(tf.constant(0.1, shape=[out_dimension]))
current_layer = tf.nn.relu(tf.matmul(current_layer, weight) + bias)
in_dimension = layer_dimension[i]

mse_loss = tf.reduce_mean(tf.square(y_ - current_layer))

2. tf.train.ExponentialMovingAverage使用样例

import tensorflow as tf

# tf.train.ExponentialMovingAverage使用样例
v1 = tf.Variable(0, dtype=tf.float32)
step = tf.Variable(0, trainable=False) # 此处step模拟神经网络迭代的轮数

# apply方法返回一个对var_list进行更新滑动平均的操作，var_list必须是list的Variable或Tensor
maintain_averages_op = ema.apply(var_list=[v1])

with tf.Session() as sess:
init_op = tf.global_variables_initializer()
sess.run(init_op)
# average方法可获取滑动平均后变量的取值
print(sess.run([v1, ema.average(v1)])) # [0.0, 0.0]

sess.run(tf.assign(v1, 5))
# min{0.99, (1+step)(10+step)=0.1}=0.1
# 更新v1的滑动平均值为 0.1*0.0+0.9*5=4.5
sess.run(maintain_averages_op)
print(sess.run([v1, ema.average(v1)])) # [5.0, 4.5]

sess.run(tf.assign(step, 10000))
sess.run(tf.assign(v1, 10))
# min{0.99, (1+step)(10+step)=0.999}=0.99
# 更新v1的滑动平均值为 0.99*4.5+0.01*10=4.555
sess.run(maintain_averages_op)
print(sess.run([v1, ema.average(v1)])) # [10.0, 4.5549998]

# 更新v1的滑动平均值为 0.99*4.555+0.01*10=4.60945
sess.run(maintain_averages_op)
print(sess.run([v1, ema.average(v1)])) # [10.0, 4.6094499]

tags: tf,sess,正则,decay,run,v1,L2,TensorFlow,dimension,模型,var,layers,神经,layer,list

1.凡CodeSecTeam转载的文章,均出自其它媒体或其他官网介绍,目的在于传递更多的信息,并不代表本站赞同其观点和其真实性负责；
2.转载的文章仅代表原创作者观点,与本站无关。其原创性以及文中陈述文字和内容未经本站证实,本站对该文以及其中全部或者部分内容、文字的真实性、完整性、及时性，不作出任何保证或承若；
3.如本站转载稿涉及版权等问题,请作者及时联系本站,我们会及时处理。